程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用Eclipse執行業務流程

用Eclipse執行業務流程

編輯:關於JAVA

開始之前

本教程面向的讀者包括:希望了解業務流程建模符號(Business Process Modeling Notation,BPMN)和業務流程執行語言(Business Process Execution Language,BPEL)XML 格式的人員,使用 Eclipse SOA Tools Platform BPMN Modeler 對業務流程建模、將 BPMN 轉換成可以部署到 Apache Orchestration Director Engine (ODE) 上的 BPEL 可執行文件的人員。使用這些流程和技術允許您建立可以快速驗證的業務流程。

關於本教程

本教程將向您展示如何使用 Eclipse SOA Tools Platform (STP) 建模業務流程,然後借助 Eclipse ATLAS Transformation Language (ATL) 項目把產生的業務流程建模符號文件轉換成業務流程執行語言,再將其部署到 Apache Orchestration Director Engine (ODE) 上。

本教程中建立的流程模型模擬一個網上沖浪者到一個 Web 站點購買玩具的過程。流程過程是這樣的:從一個送貨評估程序開始,然後檢出成功的訂單、通過電子郵件將發票寄給客戶,並啟動玩具的送貨流程

在本教程中,您將了解如何完成以下操作:

安裝 Eclipse STP、Eclipse ATL、BABEL BPMN2BPEL 工具和 Apache ODE

在 Eclipse STP 中建立業務流程模型

將 Eclipse STP 的 BPMN 格式轉換成 BABEL 的 BPMN 格式

將 BABEL 的 BPMN 格式轉換成 BPEL

創建 Apache ODE 部署描述符

為業務流程編寫 Web 服務定義語言(Web Service Definition Language,WSDL)

准備生成的 BPEL 以供部署

部署到 Apache ODE 上

系統要求

本教程要求同時使用若干項技術。例如,Apache ODE 要求使用 Apache Tomcat 之類的 Web 容器。下面是完整列表:

Classic Eclipse Eclipse 是運行 Eclipse SOA Tools Platform Project (STP) 插件的主要平台。獲取 Eclipse Classic 的最新版本,本教程中使用 V3.3.1。Eclipse SOA Tools Platform (STP) 在這裡可以找到用 STP 進行開發所需的所有核心插件。本教程使用的是 VI200710300730。注意,有多個插件及不同的下載可用,因此請確保選擇 SOA Tools Platform All-In-One Packages 標題下的 all-in-one 包。此包包括 Requirements 標題下列出的所有依賴性。Eclipse ATLAS Transformation Language (ATL) 您將使用 Eclipse ATL 項目執行 Eclipse STP 的 BPMN 到 BABEL BPMN 的轉換。本教程將使用 ATL Ready-To-Use Bundles 標題下的名為 ATL Bundle 2.0 Standard Version 的版本。BABEL 工具 要把 BABEL BPMN 格式轉換成 BPEL,必須使用這些輔助工具。您需要下載 BPMN2BPEL 項目符號下的 Java™ 二進制文件(JAR 文件)。您也可以查找可下載的示例和有用的源代碼。Apache Orchestration Director Engine (ODE) 在業務流程開發完成後需要使用 Apache ODE 部署業務流程。下載 WAR 分發文件。本教程將使用 V1.1。Apache Tomcat 本教程將使用 Apache Tomcat 作為 Apache ODE 的 servlet 容器。但是,也可以使用其他軟件,例如 Jetty。下載核心 ZIP 文件。本教程將使用 V5.5.25。Java 技術 本教程中使用的所有工具需要 Java 技術。本教程使用的是 Java 6 Update 3。操作系統 您需要能夠運行以上所有軟件的操作系統。本教程使用的是 Windows®,但是也可以使用最新版本的 Mac OS X 或 Linux®,只需相應地調整文件的位置。

您將首先詳細了解所有這些工具的安裝,然後再了解如何開始使用這些工具。

簡介

業務流程是面向服務架構(Service-Oriented Architecture,SOA)的主要部分,並使用標准的 XML 定義 BPMN 和 BPEL 創建。在本小節中,您將了解業務流程如何融合到 SOA 模型以及關於兩個業務流程 XML 標准(BPMN 和 BPEL)及其關系的更多信息。

面向服務的架構

SOA 由若干個可訪問的服務構成,這些服務可通過 Internet 彼此交互。SOA 十分易於維護和部署,因為它每次只執行一項服務。如 WSDL 所定義,業務流程具有自己的服務端點,可以通過 Internet 彼此交互並交換數據,因此可以輕松地融入到 SOA 模型中。

在接下來的兩個小節中,您將了解業務流程建模和執行格式:BPMN 和 BPEL。

業務流程建模符號

BPMN 實質上使用 XML 格式定義業務流程的任務、實體和它們之間的弧線(任務流程)。BPMN 是使用 Eclipse STP BPMN Modeler 創建的模型將被轉換成的語言。業務流程的圖形表示可以更好地解釋這一概念。

圖 1. 業務流程模型

圖片顯示了一個業務流程的橫向流程,它被分為三塊並按順序垂直擺放。在圖 1 中,業務流程的模型是使用 Eclipse STP BPMN Modeler 創建的,您稍後將使用該工具。您可以看到流程從左側的空白圓開始,使用箭頭/弧線把流程導向右側,最終在右側的空白圓處結束。

BPMN 只是使用 XML 格式的描述,例如,圖 1 中所示的模型。它包含與節點對應的頂點和與箭頭/弧線對應的 sequenceEdges。看看清單 1 中每個元素的示例。

清單 1. 示例頂點和 sequenceEdges

<vertices xmi:type="bpmn:Activity" xmi:id="_OioEMZ-jEdyW35YU1b0yXQ"
  iD="_OioEMJ-jEdyW35YU1b0yXQ" outgoingEdges="_PBxeUZ-jEdyW35YU1b0yXQ"
incomingEdges="_Pe-XsZ-jEdyW35YU1b0yXQ _PuxHMZ-jEdyW35YU1b0yXQ" name="orderCheck2"
activityType="GatewayDataBasedExclusive" looping="false"/>
   <sequenceEdges xmi:type="bpmn:SequenceEdge" xmi:id="_r1A1oZ-iEdyW35YU1b0yXQ"
iD="_r1A1oJ-iEdyW35YU1b0yXQ" source="_mxgfgZ-iEdyW35YU1b0yXQ"
target="_exzeA5-iEdyW35YU1b0yXQ"/>

頂點 實質上是節點或任務,在圖 1 中顯示為圓、菱形和四方形。在清單 1 中,您可以看到它們具有標識符,以及一組連出去的(outgoing)邊和連入(incoming)的邊。標識符僅為頂點提供一個 ID,可以引用為 sequenceEdges 的來源和目標(圖 1 中表示為從頂點指向頂點的有向箭頭)。每個 sequenceEdges 中的重要信息是指定源頂點和目標頂點的源屬性和目標屬性。請注意,此文件格式在 Apache ODE 上是不可執行的,因為它只是業務流程的模型,因此您將使用 Eclipse ATL 項目和用 BABEL 編寫的開源工具把該模型轉換成可執行模型。

業務流程執行語言

顧名思義,BPEL 可以在諸如 Apache Orchestration Director Engine (ODE) 之類的流程引擎上執行。

BPEL 與 BPMN 之間的差別在於 BPEL 更有組織,是一種可按定義執行的語言。BPEL XML 文件不包含頂點和 sequenceEdges,而包含指令序列,這些指令包括調用 Web 服務操作和一些語句,比如若條件一直為真(參見清單 2 中 <while> 開始標記之後的 <condition> ... </condition> 標記),則可以反復執行代碼序列的 while 循環,以及 if else-if else 語句。

在圖 1(第 2 部分)中,有一個反向弧線的實例。這是使用 BPMN Modeler 編寫 while 循環的方法。在那裡,您將看到兩個標簽為 while1 和 while2 的頂點,這兩個頂點將有助於對流程進行正確劃分(while1 將把兩條輸入邊合並為一條輸出邊,而 while2 將獲取一條輸入邊並將其分為兩條輸出邊)。while 循環的條件是由 while_ok 定義的,並且如果條件一直為真,則將反復執行 shippingEstimator 任務。當同一條件不再為真時,執行將中斷並且轉而執行簽出(checkout)任務。

要了解如何用 BPEL 表示上面的 while 循環模型,請查看清單 2。

清單 2. BPEL 中的示例 while 語句

<while>
    <condition>
      getVariableProperty(shippingEstimator_data_in,Message)="true"
    </condition>

    <invoke name="shippingEstimator"
        partnerLink="mybiz_flow_servicePartnerLink"
        portType="sns:mybiz_flow_servicePortType"
        operation="shippingEstimator"
        inputVariable="shippingEstimator_data_in"
        outputVariable="shippingEstimator_data_out" />

    <assign name="postShipping">
     <copy>
      <from variable="shippingEstimator_data_out" part="Message" />
      <to variable="shippingEstimator_data_in" part="Message"/>
     </copy>
    </assign>

   </while>

在這裡,您可以看到圖 1(第 2 部分)中所示的 while 循環模型是按照 BPEL 格式編寫的,這與用其他編程語言編寫的 while 循環相同,不同之處是這個循環模型使用 XML 進行定義。稍後您將再次看到這個代碼片段,並通過它了解關於其他 BPEL 結構的更多信息。

注意,以上 BPEL 不可用於單獨部署,因為它需要部署描述符和 WSDL 來定義業務流程的服務端點,您需了解這一點以便創建到 Apache ODE 的無錯部署。

總結:BPMN XML 用節點和邊定義業務流程的圖形化模型;而 BPEL 使用了諸如 while 循環和 if 語句之類的可執行結構以及可對現有 Web 服務調用操作的語句,定義業務流程的可執行模型。

您將建立的業務流程模型是一個將玩具添加到購物車中的簡單流程。用戶可以選擇使用送貨評估程序(清單 2 中所示的 while 循環)、檢出訂單(可能被拒絕,也可能被接受),如果訂單被接受,則向客戶發送一張發票,並把訂單放到送貨隊列中。

接下來,您將安裝所有必備工具,以便可以快速開發業務流程。

快速安裝指南

要開始開發業務流程,需要快速安裝本文 “系統要求” 小節中列出的所有工具。

Eclipse SOA Tools Platform (STP) 包含用於建模玩具購買業務流程的 BPMN Modeler(如圖 1 中所示)。BPMN Modeler 的輸出是模型的 BPMN XML 描述。Eclipse ATLAS Transformation Language (ATL) 把 XML 模型從一種模型轉換成另一種模型。您將使用它把 BPMN 輸出從 STP 轉換成 BABEL 工具可讀的 BPMN。BABEL 工具 這是一個 Java 命令行工具,用於把 BABEL BPMN 轉換成初步的 BPEL 格式(將進行整理)並稍後提供部署描述符和 WSDL 格式。Apaches Orchestration Director Engine (ODE) 和 Tomcat Apache ODE 將在 Apache Tomcat 內運行。您隨後將在 Apache ODE 中部署 BPEL 並且 Apache ODE 附帶了可供執行的支持文件。

安裝 Eclipse STP

Eclipse SOA Tools Platform (STP) 是包含了本教程對業務流程建模所需的 BPMN Modeler 的核心工具。在繼續安裝 Eclipse STP 之前,您需要獲取 Classic Eclipse 和 Eclipse STP All-In-One。

要進行安裝,必須按順序執行以下說明:

把 Classic Eclipse 解壓縮到程序目錄中。

把 Eclipse STP All-In-One 解壓縮到程序目錄中(如果系統詢問,請單擊 overwrite all)。

注意,把 Eclipse STP 文件解壓縮到與 Classic Eclipse ZIP 文件相同的目錄將覆蓋 Classic Eclipse 目錄中的各個文件,從而有效地合並兩者。現在將 Eclipse 目錄重命名為 STPbpmn_eclipse。在 Windows 中,運行 STPbpmn_eclipse/eclipse.exe。

安裝 Eclipse ATL

Eclipse ATL 項目是用於把 STP BPMN XML 文件轉換成 BABEL BPMN XML 文件的工具。您應當已經下載了一個可立即使用的 ATL 包(在 Windows 中,該文件名為 ATL_Bundle_2.0.0RC2_Windows.zip)。把此文件解壓縮到程序目錄中,把 eclipse 目錄重命名為 ATL_eclipse,現在,Eclipse ATL 安裝完畢。

要在 Windows 中啟動 Eclipse ATL,運行 ATL_eclipse/eclipse.exe。

安裝 BABEL 工具

您將使用下載的 BABEL JAR 文件把 BABEL BPMN XML 轉換成 BPEL。您將在命令行中激活此工具,因此將其保存到程序目錄中名為 babelBPMNtoBPEL 的目錄中。

安裝 Apache ODE 和 Tomcat

由於 Apache ODE 將在 Tomcat 內運行,因此首先安裝 Apache Tomcat。要安裝 Tomcat,只需把從 Apache.org 下載的 ZIP 文件 (apache-tomcat-5.5.25.zip) 移到程序目錄中。現在把它解壓縮並把 CATALINA_HOME 設為環境變量 (c:\apps\apache-tomcat-5.5.25)。要在 Windows 中執行這些操作,請單擊 Start > Control Panel。切換到 Classic View,然後單擊 System。在彈出的窗口中,單擊 Advanced 選項卡,然後單擊 Environment Variables。在 “User variables for ...” 下,單擊 New 並輸入新環境變量,其變量名為 CATALINA_HOME 並且變量值為 Tomcat 主目錄的路徑。

現在單擊 OK,再單擊 OK,然後再單擊 OK。Tomcat 的安裝應當完畢。

現在,安裝 Apache ODE 就十分簡單了。首先把下載的文件 (apache-ode-war-1.1.zip) 解壓縮到程序目錄中,從 apache-ode-war-1.1 目錄中提取 ode.war,並將其復制到 Tomcat 中的 webapps 目錄中。

Apache ODE 和 Tomcat 准備好運行。接下來,您將開始使用 Eclipse STP BPMN Modeler。

使用 Eclipse STP BPMN Modeler

STP BPMN Modeler 非常易於使用。您可以通過簡單的拖放操作進行任何建模,您將在本小節中嘗試執行這些操作。首先,您將了解如何創建 BPMN 圖以便對訪客在 Web 站點中購買玩具進行建模。然後您將了解在模型中使用的一些活動類型。最後,您將了解如何使用 BPMN Modeler 來最終對業務流程建模。

第一個 BPMN 圖

現在需要 Eclipse STP。由於 BPMN Modeler 並非基於項目,因此您將從一個普通項目開始。

要創建新項目,單擊 File > New > Project。接下來,展開 General 文件夾並選擇 Project。

圖 2. 創建普通項目

單擊 Next 並鍵入項目名稱 STPbpmn。

圖 3. 給項目命名

您現在應當在 Package Explorer 窗格中看到新項目。選擇該項目並單擊 File > New > Other。展開 SOA Tools 文件夾並選擇 Bpmn Diagram。

圖 4. 創建一個新的 BPMN Diagram

單擊 Next 並在 File name 空白處輸入文件名:mybiz_flow。

圖 5. 為 BPMN 圖命名

單擊 Finish 創建 BPMN 圖。您的項目現在應當按照下圖所示進行設置。

圖 6. 項目窗口

非常好!現在將了解右側面板中所示的一些活動類型、元素。

活動類型簡介

對業務流程建模可以使用多種活動類型。對您的業務流程建模時將使用下面五種活動類型。其中之一為 Start Events 下的 Empty Start。

圖 7. Empty start 事件

此活動將啟動流程,即圖 1 左側的空白圓圈。接下來是任務,如下所示:

圖 8. 任務

任務是諸如調用 Web 服務之類的命令。接下來的兩個活動是允許以獨占或並行方式將流程劃分為不同方向的兩種路徑(gateway)。第一個是基於獨占數據的路徑。

圖 9. 基於獨占數據的路徑

稍後將進一步了解此路徑的工作原理。簡言之,它用於把業務流程劃分為兩條路徑,一條用於訂單失敗的情況,另一條用於訂單成功的情況。下一個是並行路徑。

圖 10. 並行路徑

您可以使用此路徑來定義可以並行執行的兩項任務,例如向客戶發送發票和在成功處理訂單後將訂單放入送貨部門的隊列中。您將查看的最後一項活動是 Empty End 事件,該事件將結束業務流程。

圖 11. Empty End 事件

這是位於圖 1 右側的空白圓圈,此空白圓圈將終止業務流程。

對業務流程建模

現在將最終對業務流程建模。首先,單擊 Empty Start 活動並在藍色流程面板中單擊一個圓點(spot)。然後雙擊該圓點並標記為 start。

圖 12. 標記 start 活動

單擊任務活動類型,將其放到 start 圓圈的右側,雙擊它並標記為 addToyToCart。

圖 13. 標記任務

接下來,將創建一條從 start 圓圈到 addToyToCart 任務的新弧線。把光標放在 start 圓圈的右邊界上方,直至一個黑色實線箭頭顯示在圓圈右側,如圖 14 所示。單擊實線箭頭右側的小方框並將其拖動到 addToyToCart 任務。

圖 14. 創建新弧線

在 addToyToCart 任務上放開鼠標按鈕,然後應當顯示一條新弧線,把兩端鏈接在一起。

圖 15. 創建的新弧線

到這裡已經創建了第一條弧線。您的業務流程將整合在一起。繼續對業務流程建模。

圖 16. 繼續對業務流程建模

通過上圖的幫助,您應當能夠創建一項新任務 viewCart,以及包含 while 循環的兩個基於獨占數據的路徑。注意,您還可以標記弧線,如從標記為 while2 的路徑出來的兩條弧線所示。只需雙擊兩條弧線,鍵入所需標記,單擊 Enter,然後把標記拖到所需位置。按照如下所示繼續建模:

圖 17. 繼續建模

上圖顯示了簽出和 shippingEstimator 任務,可以根據圖示進行創建和連接。注意,有一條邊從 shippingEstimator 向後回到標記為 while1 的路徑:這最後將成為您在清單 2 中看到的 while 循環。在簽出任務之後,您將看到與 if-else 語句等效的內容,其中路徑被標記為 orderCheck。如果訂單失敗,流程將轉至 orderFailed 任務,如果成功,則將轉至標記為 orderTasks 的並行路徑。繼續建模業務流程的最後一部分。

圖 18. 完成業務流程模型

注意 emailInvoice 和 shippingQueue 兩項任務在並行路徑內的方式。兩項任務將並行執行,因為它們的流程沒有聯系。並行流程隨後在 orderTasks2 處合並,在 orderCheck2 再次合並,然後在 Empty End 事件處結束業務流程。

現在可以通過在包浏覽器文件中雙擊 mybiz_flow.bpmn 文件來檢驗得到的與圖對應的 BPMN。在這裡,可以看到描述剛建模的業務流程的所有頂點和 sequenceEdges。

祝賀您!您已經使用 BPMN Modeler 成功地建立了業務流程模型。接下來將進行轉換,把 BPMN 轉換成 BPEL。

把 Eclipse STP 的 BPMN 轉換成 BPEL

擁有 BPMN 之後,已經准備好將它轉換成 BPEL。為此,將借助 Eclipse ATL 項目和 BABEL 中的工具的幫助。此轉換過程是必要的,這樣才能在部署到 Apache ODE 之前有可使用的可執行文件 (BPEL)。Eclipse ATL 的任務是執行從 BPMN 到 BABEL 工具可讀的 BPMN 格式的轉換,BABEL 工具將把最終的 BPMN 轉換為 BPEL。首先創建第一個 Eclipse ATL 項目。

第一個 Eclipse ATL 項目

要創建 Eclipse ATL 項目,以便可以執行從 STP BPMN 到 BABEL BPMN 的轉換,需要在 Eclipse ATL 內創建一個新項目。啟動 ATL (ATL_project/eclipse.exe)。注意,有兩個預先存在的項目:Families2Persons 和 Tree2List。可以忽略或一並刪除這兩個項目,因為不會使用到它們。

現在將創建一個新項目來保存將要設立的轉換規則。單擊 File > New > ATL Project。

圖 19. 創建一個 ATL 項目

接下來,將彈出一個窗口要求鍵入名稱。按下圖所示命名項目 STPbpmnTObabelBPMN,然後單擊 Finish。

圖 20. 為 ATL 項目命名

現在創建了 ATL 項目,但是還有更多任務。您需要從 下載 小節得到的教程中獲取一些文件。下載完成後,提取三個文件並將其復制到 ATL 項目中。

ATL_project\STPbpmnTObabelBPMN\metamodels\bpmn.ecore 定義 BABEL BPMN 文件結構的 EMF 文件。ATL_project\STPbpmnTObabelBPMN\metamodels\stpmodel.ecore 定義 STP BPMN 文件結構的 EMF 文件。ATL_project\STPbpmnTObabelBPMN\transformation\bpmn2babel.atl 這是定義從 STP BPMN 到 BABEL BPMN 轉換的 ATL 文件。

此外,把從 Eclipse STP 項目生成的 mybiz_flow.bpmn 文件復制到 Eclipse ATL 項目中。ATL 項目的包浏覽器現在應當類似圖 21。

圖 21. 顯示已復制文件的 ATL 項目的包浏覽器視圖

注意,bpmn2babel.asm 文件是在編譯 bpmn2babel.atl 文件時由 Eclipse ATL 自動生成的。

此時,ATL 項目已創建完畢並且您現在可以開始執行轉換。

把 STP BPMN 轉換成 BABEL BPMN

現在,可以將 Eclipse STP BPMN Modeler 的 BPMN 輸出轉換成 BABEL 工具可讀的 BPMN 格式。但是,在開始執行轉換前,需要做最後一件事情。截至 Eclipse STP 的當前版本,BPMN 的輸出中有一個 bug(它不符合相應的 stpmodel.ecore)。要修復此 bug,請在包浏覽器窗口中雙擊 mybiz_flow.bpmn 文件打開該文件(參見圖 21)。

替換以下所有實例:

把 Parallel Gateway 替換為 GatewayParallel

把 Exclusive Data-based Gateway 替換為 GatewayDataBasedExclusive

把 Empty Start Event 替換為 EventStartEmpty

把 Empty End Event 替換為 EventEndEmpty

BPMN 已准備好進行轉換。要繼續,請單擊 Run > Open Run Dialog。在左側列中,右鍵單擊 ATL Transformation,然後單擊 New。把啟動配置命名為 STPbpmnTObabelBPMN,並且在項目窗格中,選擇名稱 (STPbpmnTObabelBPMN) 中的項目以及該項目中的 bpmn2babel.atl 文件,如圖 22 所示。然後可以通過鍵入每個 Ecore 文件的路徑或者通過選擇相應的工作空間按鈕並進行浏覽,選擇元模型窗格中的 BPMN 和 BABEL Ecore 元模型。

圖 22. 配置 ATL 啟動配置

然後,仍然如圖 22 所示,需要選擇一個源模型 (mybiz_flow.bpmn),方法是直接輸入或單擊 Workspace 並在項目中浏覽相應文件。由於目標模型還不存在(這是由 Eclipse ATL 生成的文件),因此您將把源模型文件復制到目標模型文件中,並且鍵入 BABEL_ 作為它的前綴(參見圖 22 中的源模型和目標模型窗格)。

目前為止已經介紹了很多信息,最後還剩下一件事要完成:添加庫。要完成此操作,單擊 Add library(如圖 22 的左下角所示),將彈出一個要求輸入名稱的窗口,接受默認值,然後只需單擊 OK。一個庫隨後將顯示在 Libraries 窗格中(圖 22 中 Target Models 窗格的右側)。單擊 Workspace 按鈕,如下所示:

圖 23. 把庫文件輸入到 ATL 啟動配置中

在項目轉換目錄中浏覽文件。

圖 24. 輸入庫

單擊 OK。結束!啟動配置已經准備好運行。確保單擊位於窗口右下角的 Apply 來保存更改。

要啟動配置並執行轉換,請單擊位於窗口右下角的 Run,這樣就可以了!您現在應當會注意到 ATL 項目中 models 文件夾的一個新文件,如圖 25 所示。這是 BABEL BPMN 中間格式。

圖 25. 生成 BABEL BPMN

把 BABEL BPMN 轉換成 BPEL

要執行轉換,請將 BABEL_mybiz_flow.bpmn 從 Eclipse ATL 項目復制到先前安裝 BABEL 工具時創建的 babelBPMNtoBPEL 目錄中。

在繼續執行其余轉換之前,還需要對 BABEL_mybiz_flow.bpmn 文件進行最後一次編輯。首先:注意有兩個 <babelBpmn:DocumentRoot> 子元素。刪除其中一個子元素(可以把您的文件與從 下載 小節下載的代碼的 babelBPMNtoBPEL 目錄中的文件相比較)。

打開控制台,並把目錄切換到包含剛創建的 BPMN2BPEL.jar 文件和 BABEL BPMN 文件 (BABEL_mybiz_flow.bpmn) 的 babelBPMNtoBPEL。鍵入以下命令創建 BPEL:java -jar BPMN2BPEL.jar BABEL_mybiz_flow.bpmn。

運行以上工具產生的最後幾行將創建如清單 3 所示的輸出,創建一個新文件 BPEL_BABEL_mybiz_flow.bpmn.bpel。

清單 3. 從 BABEL BPMN 轉換到 BPEL

328 [main] DEBUG controller.BPMN2BPEL - Step 5: Build the BPEL-Tree.
328 [main] DEBUG controller.BPMN2BPEL - Output the BPEL-XML into a File.
343 [main] DEBUG model.backEnd.EmitterBPEL4BPMN - ChildLIST:1
343 [main] DEBUG controller.BPMN2BPEL - Directory :
343 [main] DEBUG controller.BPMN2BPEL - File :
BPEL_BABEL_mybiz_flow.bpmn.bpel

將 BPEL_BABEL_mybiz_flow.bpmn.bpel 重命名為 mybiz_flow.bpel 並將其復制到另一個目錄 apacheODE_process/mybiz_flow/ 中。打開 BPEL 文件並注意 while 循環,如下所示:

清單 4. 創建的 while 循環

<while condition="while_ok">
    <invoke name="shippingEstimator"
        partnerLink="local"
        portType="localPT"
        operation="shippingEstimator"
        inputVariable="shippingEstimator_data_in"
        outputVariable="shippingEstimator_data_out" />
   </while>

在這裡,您可以把此處創建的 while 循環與在清單 2 結束部分的循環相比較。注意兩者的語法是不同的。這是由於自動生成的版本將為 BPEL 開發創建一個優秀的起點,這是從頭開始創建 BPEL 的額外優點。

在下一小節中,您將為在 Apache ODE 上部署業務流程做准備。

為在 Apache ODE 上部署業務流程做准備

您已經得到了要使用的 BPEL。您將使用此文件作為最終部署到 Apache ODE 上的 BPEL 文件的起點。但是,在這樣做之前,您將創建一個 Apache ODE 部署描述符和兩個 WSDL 文件:一個作為 BPEL 的服務端點,而另一個作為支持服務,每個文件都有助於實現玩具購買業務流程的功能。

編寫部署描述符

要編寫的部署描述符將告訴 Apache ODE 如何部署玩具購買業務流程以及需要激活哪些服務。創建一個新文件 deploy.xml,然後按照如下所示內容定義該文件。

清單 5. 編寫 Apache ODE 部署描述符

<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
     xmlns:pns="http://ibm/dw/ode/bpel/executor"
     xmlns:wns="http://ibm/dw/ode/bpel/executor.wsdl"
     xmlns:sns="http://ibm/dw/ode/bpel/service.wsdl">

  <process name="pns:mybiz_flow">
   <active>true</active>
   <provide partnerLink="mybiz_flowPartnerLink">
    <service name="wns:mybiz_flowService" port="mybiz_flowPort"/>
   </provide>
   <provide partnerLink="mybiz_flow_servicePartnerLink">
    <service name="sns:mybiz_flow_serviceService"
         port="mybiz_flow_servicePort"/>
   </provide>
   <invoke partnerLink="mybiz_flow_servicePartnerLink">
    <service name="sns:mybiz_flow_serviceService"
         port="mybiz_flow_servicePort"/>
   </invoke>
  </process>
</deploy>

這裡有幾個重要元素。第一個是 process 元素。注意它根據 BPEL 文件的名稱命名。通過該方法了解引用了哪個 BPEL 文件。接下來,有兩個 provide 元素用於定義引用服務端點的合作伙伴鏈接。第一個是與 BPEL 文件相關的主要合作伙伴鏈接,而第二個是支持合作伙伴鏈接。您將看到在將要編寫的兩個 WSDL 文件中和在稍後對 BPEL 文件做出的更改中如何引用這兩個合作伙伴鏈接。

編寫業務流程的 WSDL

WSDL 允許把玩具購買業務流程公開為一項服務。下面是擁有單個消息、操作、綁定、服務和 partnerLinkType 的簡單 WSDL,如下所示:

清單 6. 通過 WSDL 公開業務流程

<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions
   targetNamespace="http://ibm/dw/ode/bpel/executor.wsdl"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   xmlns:tns="http://ibm/dw/ode/bpel/executor.wsdl"
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype">

  <wsdl:message name="mybiz_flowMessage">
   <wsdl:part name="Message" type="xsd:string"/>
  </wsdl:message>

  <wsdl:portType name="mybiz_flowPortType">
   <wsdl:operation name="execute">
    <wsdl:input message="tns:mybiz_flowMessage" name="In"/>
    <wsdl:output message="tns:mybiz_flowMessage" name="Out"/>
   </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="mybiz_flowSoapBinding"
         type="tns:mybiz_flowPortType">
   <soap:binding style="rpc"
          transport="http://schemas.xmlsoap.org/soap/http"/>
   <wsdl:operation name="execute">
    <soap:operation soapAction="" style="rpc"/>
    <wsdl:input>
     <soap:body
       namespace="http://ibm/dw/ode/bpel/executor.wsdl"
       use="literal"/>
    </wsdl:input>
    <wsdl:output>
     <soap:body
       namespace="http://ibm/dw/ode/bpel/executor.wsdl"
       use="literal"/>
    </wsdl:output>
   </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="mybiz_flowService">
   <wsdl:port name="mybiz_flowPort" binding="tns:mybiz_flowSoapBinding">
    <soap:address
       location="http://localhost:8080/ode/processes/mybiz_flow"/>
   </wsdl:port>
  </wsdl:service>

  <plnk:partnerLinkType name="mybiz_flowPartnerLinkType">
   <plnk:role name="executor" portType="tns:mybiz_flowPortType"/>
  </plnk:partnerLinkType>

</wsdl:definitions>

WSDL 非常簡單,使用一條消息作為執行操作的輸入和輸出(在 portType 元素中定義)。單個操作隨後被綁定到 portType(在綁定元素中),綁定到定義了服務端點的端口(在 service 元素中)。execute 操作將開始執行玩具購買業務流程,您將在下一小節中看到。

通過 partnerLinkType 記錄部署描述符鏈接。清單 5 的第一個 partnerLink 元素中引用了合作伙伴鏈接名稱、服務和端口名稱。在 BPEL 中,您將通過以上 partnerLinkType 引用服務及其綁定端口。

編寫 WSDL 以支持業務流程

要調用外部 Web 服務,玩具購買業務流程要求提供合作伙伴鏈接,這就是清單 5 中提供了兩個合作伙伴鏈接的原因:第二個合作伙伴鏈接將定義您在此小節中編寫的 Web 服務,其中包含 BPMN 中所有任務的所有操作。而調用第一個合作伙伴鏈接將激活業務流程,在執行業務流程時將由業務流程調用此支持 Web 服務。現在查看一下它的 WSDL。

清單 7. 通過 WSDL 公開支持 Web 服務

<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions
   targetNamespace="http://ibm/dw/ode/bpel/service.wsdl"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   xmlns:tns="http://ibm/dw/ode/bpel/service.wsdl"
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype">

  <wsdl:message name="mybiz_flow_serviceMessage">
   <wsdl:part name="Message" type="xsd:string"/>
  </wsdl:message>

  <wsdl:portType name="mybiz_flow_servicePortType">
   <wsdl:operation name="addToyToCart">
    <wsdl:input message="tns:mybiz_flow_serviceMessage" name="In"/>
    <wsdl:output message="tns:mybiz_flow_serviceMessage" name="Out"/>
   </wsdl:operation>

   <wsdl:operation name="viewCart">
...

   <wsdl:operation name="shippingEstimator">
...

   <wsdl:operation name="checkout">
...

   <wsdl:operation name="orderFailed">
...

   <wsdl:operation name="emailInvoice">
...

   <wsdl:operation name="shippingQueue">
...
  </wsdl:portType>

  <wsdl:binding name="mybiz_flow_serviceSoapBinding"
         type="tns:mybiz_flow_servicePortType">
   <soap:binding style="rpc"
          transport="http://schemas.xmlsoap.org/soap/http"/>

   <wsdl:operation name="addToyToCart">
    <soap:operation soapAction="" style="rpc"/>
    <wsdl:input>
     <soap:body
       namespace="http://ibm/dw/ode/bpel/service.wsdl"
       use="literal"/>
    </wsdl:input>
    <wsdl:output>
     <soap:body
       namespace="http://ibm/dw/ode/bpel/service.wsdl"
       use="literal"/>
    </wsdl:output>
   </wsdl:operation>

   <wsdl:operation name="viewCart">
...

   <wsdl:operation name="shippingEstimator">
...

   <wsdl:operation name="checkout">
...

   <wsdl:operation name="orderFailed">
...

   <wsdl:operation name="emailInvoice">
...

   <wsdl:operation name="shippingQueue">
...

  <wsdl:service name="mybiz_flow_serviceService">
   <wsdl:port name="mybiz_flow_servicePort"
         binding="tns:mybiz_flow_serviceSoapBinding">
    <soap:address
     location="http://localhost:8080/ode/processes/mybiz_flow_service"/>
   </wsdl:port>
  </wsdl:service>

  <plnk:partnerLinkType name="mybiz_flow_servicePartnerLinkType">
   <plnk:role name="service" portType="tns:mybiz_flow_servicePortType"/>
  </plnk:partnerLinkType>

</wsdl:definitions>

訪問 下載 小節查看完整的 WSDL 定義。注意,在本教程中已經定義的玩具購買業務流程中的每項任務都有一個操作。為簡單起見,此 Web 服務的操作的定義方法與清單 6 中的 execute 操作極為相似,因此無需詳細了解這個操作。您可能希望擴展操作並讓這些操作完成其他工作,然後使操作的輸入和輸出消息接受 xsd:string 類型的 Message,這取決於業務流程的需求。

完善生成的 BPEL 文件

在把業務流程部署到 Apache ODE 上之前還必須完成的最後一項工作是填充在清單 3 中為玩具購買業務流程生成的 BPEL 文件。您將需要重新定義 Namespaces 並導入您在清單 6 和清單 7 中編寫的兩個 WSDL 文件。

清單 8. Namespaces 和 WSDL 導入

<?xml version="1.0" encoding="UTF-8"?>
<process name="mybiz_flow"
      targetNamespace="http://ibm/dw/ode/bpel/executor"
      xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
      xmlns:tns="http://ibm/dw/ode/bpel/executor"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:test="http://ibm/dw/ode/bpel/executor.wsdl"
      xmlns:sns="http://ibm/dw/ode/bpel/service.wsdl"
      queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
      expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
>

  <import location="mybiz_flow.wsdl"
      namespace="http://ibm/dw/ode/bpel/executor.wsdl"
      importType="http://schemas.xmlsoap.org/wsdl/" />

  <import location="mybiz_flow_service.wsdl"
      namespace="http://ibm/dw/ode/bpel/service.wsdl"
      importType="http://schemas.xmlsoap.org/wsdl/" />
...

這將設置 BPEL 文件,因此您可以正確調用每個 WSDL 文件中定義的合作伙伴鏈接、消息類型、服務和操作。實際上將列出業務流程中將使用的所有合作伙伴鏈接和變量。

清單 9. 聲明合作伙伴鏈接和變量

...
      namespace="http://ibm/dw/ode/bpel/service.wsdl"
      importType="http://schemas.xmlsoap.org/wsdl/" />
  <!--bpmn2bpel Version 1.0-->
  <partnerLinks>
   <!--List of services participating in this BPEL process-->
   <partnerLink name="mybiz_flowPartnerLink"
          partnerLinkType="test:mybiz_flowPartnerLinkType"
          myRole="me" />

   <partnerLink name="mybiz_flow_servicePartnerLink"
          partnerLinkType="sns:mybiz_flow_servicePartnerLinkType"
          partnerRole="service"
          initializePartnerRole="yes" />
  </partnerLinks>

  <variables>
   <!--List variables used in this BPEL process-->
   <variable name="toyChosen"
        messageType="test:mybiz_flowMessage"/>
   <variable name="addToyToCart_data_in"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="addToyToCart_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="viewCart_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="shippingEstimator_data_in"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="shippingEstimator_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="checkout_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="orderFailed_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="emailInvoice_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
   <variable name="shippingQueue_data_out"
        messageType="sns:mybiz_flow_serviceMessage"/>
  </variables>
...

在這裡,您看到聲明了兩個合作伙伴鏈接。第一個是接受初始的實例化調用的主要合作伙伴鏈接(參見清單 10 中的 receive 元素),隨後的合作伙伴鏈接定義將為業務流程中各項任務調用的服務。在調用業務流程期間,變量需要執行復制、存儲和讀取數據操作,這樣您可以看到在兩個變量元素中封裝的需要在上面定義的每個變量。

您將了解如何開始執行業務流程。

清單 10. 啟動流程

...
  </variables>
  <sequence name="sequenceComponent_5">
   <receive name="ProcessInstantiation"
        partnerLink="mybiz_flowPartnerLink"
        portType="test:mybiz_flowPortType"
        operation="execute"
        variable="toyChosen"
        createInstance="yes" />

   <assign name="copyToy">
    <copy>
     <from variable="toyChosen" part="Message" />
     <to variable="addToyToCart_data_in" part="Message"/>
    </copy>
   </assign>

   <sequence name="sequenceComponent_0">
    <invoke name="addToyToCart"
        partnerLink="mybiz_flow_servicePartnerLink"
        portType="sns:mybiz_flow_servicePortType"
        operation="addToyToCart"
        inputVariable="addToyToCart_data_in"
        outputVariable="addToyToCart_data_out" />
    <invoke name="viewCart"
        partnerLink="mybiz_flow_servicePartnerLink"
        portType="sns:mybiz_flow_servicePortType"
        operation="viewCart"
        inputVariable="addToyToCart_data_out"
        outputVariable="viewCart_data_out" />
   </sequence>
...

首先,外部客戶需要調用您在 mybiz_flow.wsdl 文件中定義的 mybiz_flow 服務的執行操作,啟動玩具購買業務流程。這將發生在清單 10 所示的 receive 元素中,同時有效負載保存在 toyChosen 變量中。接著,把 toyChosen 變量的 Message 部分復制到 addToyToCart_data_in 變量的 Message 部分中(由於兩者類型不同,因此此復制語句是必須添加的),這是調用 addToyToCart 操作的輸入。addToyToCart 操作的輸出隨後作為輸入提供給 viewCart 操作。注意,執行流程與您先前建模的玩具購買業務流程完全相同(參見圖 1)。

繼續填充 BPEL,如下所示:

清單 11. while 循環

...
        outputVariable="viewCart_data_out" />
   </sequence>
   <assign name="preShipping">
    <copy>
     <from variable="viewCart_data_out" part="Message" />
     <to variable="shippingEstimator_data_in" part="Message"/>
    </copy>
   </assign>

   <while>
    <condition>
      getVariableProperty(shippingEstimator_data_in,Message)="true"
    </condition>

    <invoke name="shippingEstimator"
        partnerLink="mybiz_flow_servicePartnerLink"
        portType="sns:mybiz_flow_servicePortType"
        operation="shippingEstimator"
        inputVariable="shippingEstimator_data_in"
        outputVariable="shippingEstimator_data_out" />

    <assign name="postShipping">
     <copy>
      <from variable="shippingEstimator_data_out" part="Message" />
      <to variable="shippingEstimator_data_in" part="Message"/>
     </copy>
    </assign>

   </while>
...

在執行 viewCart 操作時,輸出被復制到 shippingEstimator_data_in 變量中,用於計算 while 條件。如果 shippingEstimator_data_in 變量的 Message 部分等於 “true”,則執行 while 循環,執行 shippingEstimator 任務。在調用 shippingEstimator 操作時,輸出被復制回 shippingEstimator_data_in 變量中,因此可以重新檢驗 while 條件。如果 shippingEstimator 操作的輸出是除了 “true” 之外的其他內容,則繼續執行簽出任務。

清單 12. 檢驗檢出的訂單

...
   </while>
   <sequence name="sequenceComponent_3">

    <invoke name="checkout"
        partnerLink="mybiz_flow_servicePartnerLink"
        portType="sns:mybiz_flow_servicePortType"
        operation="checkout"
        inputVariable="shippingEstimator_data_in"
        outputVariable="checkout_data_out" />

    <if>
     <condition>
      getVariableProperty(checkout_data_out,Message)="failed"
     </condition>
     <invoke name="orderFailed"
         partnerLink="mybiz_flow_servicePartnerLink"
         portType="sns:mybiz_flow_servicePortType"
         operation="orderFailed"
         inputVariable="checkout_data_out"
         outputVariable="orderFailed_data_out" />
     <else>
      <flow name="flowComponent_1">
       <invoke name="emailInvoice"
           partnerLink="mybiz_flow_servicePartnerLink"
           portType="sns:mybiz_flow_servicePortType"
           operation="emailInvoice"
           inputVariable="checkout_data_out"
           outputVariable="emailInvoice_data_out" />
       <invoke name="shippingQueue"
           partnerLink="mybiz_flow_servicePartnerLink"
           portType="sns:mybiz_flow_servicePortType"
           operation="shippingQueue"
           inputVariable="emailInvoice_data_out"
           outputVariable="shippingQueue_data_out" />
      </flow>
     </else>
    </if>
   </sequence>

  </sequence>
</process>

如果調用 checkout 操作的輸出表示訂單失敗(checkout_data_out variable="failed" 的 Message 部分),則執行 orderFailed 任務,終止業務流程。如果訂單成功(checkout_data_out 變量的 Message 部分是除了 “failed” 以外的其他內容),則同時執行 emailInvoice 和 shippingQueue 操作(由它們封裝的流程元素表示),終止業務流程。

您的項目已經准備好部署到 Apache ODE 上,這是您要執行的下一項任務。

部署到 Apache ODE 上

在最後一個步驟中,您將引入通過 WSDL 定義的兩項服務,可執行的 (BPEL) 玩具購買業務流程和在同一個目錄中的部署描述符,然後部署到 Apache ODE 上。要部署業務流程,請啟動 Apache Tomcat,它將自動激活 Apache ODE。接下來,把包含部署描述符、兩個 WSDL 文件和 BPEL 的目錄(下載教程中的 apacheODE_process\mybiz_flow 目錄)復制到 Apache ODE 的 processes 目錄 tomcat-5.5.25/webapps/ode/WEB-INF/processes 中。

您應當在 Tomcat 輸出控制台中看到下面表示部署成功的輸出:

INFO - GeronimoLog.info(79) | Deployment of artifact mybiz_flow successful: \
type="inline">[{http://ibm/dw/ode/bpel/executor}mybiz_flow-40]

您還可以通過訪問 http://localhost:8080/ode/services/listServices 查看運行在服務器上的已部署服務(參見圖 26)。

圖 26. 成功部署的服務

您可以看到通過 WSDL 公開的兩項 Web 服務,並且具備了所有的操作。

您已經卓有成效地將業務流程概念實現為可以部署到 Apache ODE 上的業務流程,這是實現完整 SOA 的重要部分。

結束語

您已經完成了本教程的學習,具備了業務流程建模的專業知識。您還成功地把 Eclipse STP BPMN Modeler 輸出的 BPMN 轉換成稍加准備就能部署到 Apache ODE 上的 BPEL。

要進一步擴展本文的工作,還有最後一道障礙需要克服:需要實現在清單 7 的 WSDL 中定義的 mybiz_flow_service,並且有兩種方法可以完成。首先,可以使用 Axis2 把 WSDL 編譯成 Java Web 服務表示,也可以手動編寫另一種業務流程繼續處理 BPEL 中的每個 invoke 元素。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved