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

使用Eclipse BPEL插件開發和執行WS-BPEL V2.0業務流程

編輯:關於JAVA

WS-BPEL 是什麼?

WS-BPEL 是由 OASIS 開發的供應商中立的規范,它將把業務流程指定為 Web 服務之間的一套互動操作。OASIS 將把 WS-BPEL 定義為如下內容:“可以通過兩種方法描述業務流程。可執行業務流程將為業務互動中的參與者的實際行為建模。抽象業務流程都是部分指定的流程,不適於執行。抽象流程可以隱藏一些必需的具體操作信息。抽象流程充當描述角色,具有多個可能的用例,包括可觀測行為以及流程模板。WS-BPEL 的意圖是為可執行流程和抽象流程的行為建模。

“WS-BPEL 為可執行業務流程和抽象業務流程的規范提供了一種語言。通過這樣做,它將擴展 Web 服務互動模型並使它可以支持業務事務。WS-BPEL 將定義一個可互操作的綜合模型,該模型應當有助於在企業內空間和 B2B 空間中擴展自動化流程整合。”

Apache Foundation 把它的 Web 服務業務流程執行語言(Web Services Business Process Execution Language,WS-BPEL)V2.0 實現稱為 Orchestration Director Engine (ODE)。ODE 將執行 WS-BPEL 流程,這些流程能夠與 Web 服務進行通信、發送和接收消息等。Eclipse BPEL 項目是一個相關的開源項目,該項目將為 WS-BPEL V2.0 流程的可視化開發提供一個 Eclipse 插件(如果您還不了解這項技術,請參閱 “WS-BPEL 是什麼”)。

撰寫本文時,ODE V1.1 和 Eclipse BPEL 項目裡程碑 M3 是最新版本。本文將檢驗這些產品並介紹如何使用 Apache ODE 和 Eclipse BPEL 項目創建您自己的 BPEL 流程並將其集成到應用程序中。

如果您更為熟悉 BPMN,則可能需要查看由 Tyler Anderson 撰寫並發表在 developerWorks 中的文章 “用 Eclipse 執行業務流程”,要處理業務流程,還需要查看使用 Eclipse STP BPMN Modeler 的教程。

軟件安裝

您的操作系統可以是近期版本的 Microsoft® Windows®、Linux® 或 Mac OS X。本文是使用 Linux 撰寫的,因此您可能需要根據操作系統的風格調整文件位置。在為 Eclipse 安裝 ODE 和 BPEL 之前,確保您的計算機已經安裝了下列軟件:

Java™ V5.0 或更高版本

Tomcat V5.5 或更高版本

安裝了以下插件的 Eclipse V3.3.x:

EMF V2.3.x

GEF V3.3.x

DTP STK V1.5.x

WTP (Web Tools Platform) V2.0.x

請參考各個應用程序的安裝指南進行安裝。

Apache ODE 安裝

下載 ODE。啟動 Apache Tomcat Web 容器並使用 Tomcat Manager(應當會在您的計算機中的 http://localhost:8080/manager/html 找到)部署發行版歸檔中的 ode.war 模塊。要檢查是否成功,請訪問 http://localhost:8080/ode/,該地址將顯示您計算機的 ODE Web 服務的狀態。

Eclipse 的 BPEL 支持

要安裝 Eclipse BPEL 項目,請運行 Eclipse 應用程序,啟動 Eclipse 更新管理器(通過單擊菜單 Help > Software Update > Find & Install)並選擇 New feature 來安裝選項。單擊 New Remote Site... 並把 URL http://download.eclipse.org/technology/bpel/update-site/ 添加到 New Update Site 對話框中,然後把站點命名為 BPEL。單擊 Finish,選擇最近的鏡像,選擇 BPEL Designer for Eclipse,同意許可證條款,單擊 Select All 選項,然後單擊 Next 和 Finish。Eclipse 將提醒所有潛在的復制沖突,然後警告 BPEL 正被取消簽名。如果提供者是 Eclipse.org,單擊 Install。安裝完成時,Eclipse 將詢問您是否重新啟動計算機。

創建一個簡單的 BPEL 流程

在此部分中,我們將創建一個簡單的 BPEL 流程並嘗試在 ODE 中運行它。此流程僅執行簡單的字符串處理。記住,它只是一個簡單示例,而且您可以使用 WS-BPEL V2.0 規范創建更加復雜的流程。

Eclipse BPEL 編輯器

要創建一個簡單的 BPEL 流程,請運行 Eclipse 並單擊 File > New > Other 菜單項,選擇 BPEL 2.0 -> BPEL Project 選項並創建一個名為 HelloWorld 的新 BPEL 項目。創建了項目後,您就可以創建第一個 BPEL 流程了。再次單擊 File > New > Other 菜單項並選擇 BPEL 2.0 > New BPEL Process File 選項來啟動 BPEL 流程創建向導。

圖 1. 創建 BPEL 流程文件

讓我們創建一個同樣名為 HelloWorld 的同步流程。在向導的下一頁中,您應當選擇 BPEL 流程文件位置 —— 只需選擇先前創建的項目並單擊 Finish。系統將創建樣例流程。

圖 2. 創建一個同步流程

如示,新建流程有兩個內部 BPEL 變量 —— input 和 output —— 以及帶有一個接收元素和一個應答元素的序列。接收塊負責接收輸入的 BPEL 流程數據和變量輸入的初始化。類似地,應答塊旨在使用輸出變量輸出 BPEL 流程數據。

同樣在創建 BPEL 流程期間,向導創建了一個 WSDL 文件。此文件將描述輸入和輸出數據類型以及表示 BPEL 流程的端口類型。輸入和輸出數據類型都只包含單個字符串字段。

我們已經准備好把一些數據處理添加到流程中。為此,請在 receiveInput 塊和 replyOutput 塊之間拖放一個 Assign 塊。

圖 3. 拖放 Assign 塊

在放置了賦值塊後,右鍵單擊 Assign 塊並選擇 Show In Properties 上下文菜單項以顯示 Properties 視圖並選擇 Details 選項卡。Assign 塊應當會用一個初始的 XML 標記結構來初始化輸出變量。它是大多數 BPEL 處理引擎必需的常用程序。單擊 Detail 選項卡中的 New 按鈕以開始創建第一個賦值程序。在 From 選擇框中選擇 Fixed Value 元素並在文本區域中輸入下列行:

>tns:HelloWorldResponse xmlns:tns="http://www.ibm.com/wd2/ode/HelloWorld">
    >tns:result/>
    >/tns:HelloWorldResponse>

接下來,在 To 選擇框中選擇 Variable 元素並在變量樹中選擇 output/payload 變量,如下所示:

圖 4. 初始化輸出變量

在初始化了輸出變量後,我們可以創建一個新的賦值程序。對於樣例流程,此程序將從輸入變量中獲取一個字符串值,把它與 “Hello” 問候語連接起來並把結果賦給輸出變量字符串字段。為此,單擊 New 按鈕並在 From 選擇框中選擇 Expression 值。在下面顯示的文本框中,輸入以下表達式:concat("Hello ", $input.payload/tns:input)。在 To 部分中,選擇 output/payload/tns:result 變量,如下所示:

圖 5. 選擇 output/payload/tns:result

Assign 塊已經就緒。正如您所見,Eclipse BPEL 插件將提供 XPath V1.0 突出顯示功能和代碼完成功能來簡化 XPath 查詢的創建操作。

WSDL 文件更改

BPEL 流程的 WSDL 文件應當描述 BPEL 流程中使用的類型以及端口類型、綁定和流程的服務。由向導自動創建的 WSDL 已經包含一個端口類型,而且為了使流程可以運行,我們需要為它創建綁定和服務。

在單獨的編輯器中打開 WSDL 文件並查看端口類型圖形化定義。

圖 6. 查看端口類型圖形化定義


 

要創建 Web 服務綁定,請右鍵單擊 WSDL 編輯器中的任意空白區域並選擇 Add Binding 選項。在 Properties 視圖中,把新建綁定重命名為 HelloWorldBinding 並選擇 HelloWorld 作為新綁定的端口類型。單擊 Generate Binding Content 按鈕將顯示 Binding Wizard 對話框。

圖 7. Binding Wizard 對話框

在 Protocol 選擇框中選擇 SOAP 協議,在 SOAP Binding Options 部分中選中 document-literal 選項並單擊 Finish。

圖 8. 綁定選項

創建了綁定後,右鍵單擊 WSDL 編輯器中的空白區域並選擇 Add Service 菜單項來創建一個名為 HelloWorldService 的新綁定。然後把 HelloWorldPort 指定為綁定的端口名稱並把 URL http://localhost:8080/ode/processes/HelloWorld 指定為綁定的地址。同時選擇 HelloWorldBinding 作為新建服務的綁定。

圖 9. HelloWorldBinding

WSDL 文件已經准備好被部署到 ODE 應用程序中。

部署描述符

在准備好部署流程之前需要做的最後一件事是創建 ODE 描述符。描述符必須名為 deploy.xml 且必須放在存儲 BPEL 和 WSDL 文件的目錄中。只需創建一個新的 deploy.xml 文本文件並把以下內容放置在該文件中。

清單 1. 創建 deploy.xml 文本文件

>?xml version="1.0" encoding="UTF-8"?>
>deploy xmlns="http://ode.fivesight.com/schemas/2006/06/27/dd"
   xmlns:pns="http://www.ibm.com/wd2/ode/HelloWorld"
   xmlns:wns="http://www.ibm.com/wd2/ode/HelloWorld">
  >process name="pns:HelloWorld">
   >active>true>/active>
   >provide partnerLink="client">
    >service name="wns:HelloWorldService" port="HelloWorldPort"/>
   >/provide>
  >/process>
  >/deploy>

描述符將為可部署單元指定流程和服務列表。

使用 BPEL 流程

現在,當 HelloWorld BPEL 流程就緒時,我們可以把它部署到 ODE 應用程序中並測試該流程。

把 BPEL 流程部署到 ODE 中

ODE 支持熱部署 BPEL 流程。要部署在先前部分中創建的流程,只需把包含流程的所有文件的文件夾復制到部署了 ODE 的 Apache Tomcat 的 webapps/ode/WEB-INF/processes 目錄中。要監視部署流程,可以查看 Tomcat 根目錄中的日志文件 logs/catalina.out,查找所有新輸入。

測試已部署流程的一種簡單方法是使用 Eclipse Web Services Explorer 工具。右鍵單擊 HelloWorld WSDL 文件並選擇 Web Services > Test with Web Services Explorer 彈出式菜單項。Eclipse 將啟動 Web Services Explorer 測試工具。使用此工具,把一些文本輸入到輸入參數中並調用 Process 操作。如圖 10 所示,Web 服務將向您剛輸入的文本返回問候語。

圖 10. 調用 WSDL 操作

創建 BPEL 流程客戶機

在擁有了執行 BPEL 流程的 Web 服務後,我們可以把此流程集成到客戶機應用程序中。讓我們使用 Eclipse WTP 插件來生成基於 Axis 的 Web 服務客戶機。在生成客戶機代碼之前,需要把 Tomcat 服務器添加到 Eclipse 服務器的列表中。單擊 File > New > Other 菜單項並從列表中選擇 Server 選項。然後,執行向導步驟來為 Eclipse 工作空間創建新 Tomcat 服務器。

在創建了服務器後,右鍵單擊 WSDL 文件並選擇 Web Services > Generate Client 彈出式菜單項。此操作將啟動 Web Service Client 向導,該向導將生成一個新項目,提供了處理 Web 服務所需的類。

圖 11. 設置 Web 服務客戶機

要使用生成的文件,請使用類似如下所示的代碼:

清單 2. 創建 Web 服務客戶機

HelloWorldServiceLocator locator = new HelloWorldServiceLocator();
HelloWorldRequest hwRequest = new HelloWorldRequest();
hwRequest.setInput("developerWorks!");

HelloWorldResponse hwResponse = locator.getHelloWorldPort().process(hwRequest);
String output = hwResponse.getResult();

在執行了代碼後,輸出變量應當包含 BPEL 流程工作的結果。

ODE 管理 API

ODE 通過 Web 服務提供對一些應用程序管理功能的訪問。通過使用 ODE,您可以控制部署到 ODE 中的流程及其實例,這些實例目前是在服務器中執行的。所有操作都是在位於 Tomcat 應用程序的文件夾 webapps/ode/WEB-INF 中的 pmapi.wsdl 文件中描述的。不幸的是,pmapi.wsdl 將使用舊 RPC 文檔樣式,並且,很難通過 Eclipse Web Services Explorer 測試工具使用它。

訪問管理 API 的最佳方式是使用 Axis2 庫。特別是使用 ServiceClientUtil 類,該類是由 ode-axis2 庫提供的。Axis2 將依賴於其他庫,包括 Xerces、Stax 等。ode.war 歸檔中附帶了大多數庫,因此可以將其添加到項目依賴關系中。

以下代碼將演示如何提取當前流程實例的信息。

清單 3. 提取當前流程實例的信息

ServiceClientUtil client = new ServiceClientUtil();
OMElement msg = client.
  buildMessage("listAllInstances", new String[] {}, new String[] {});
OMElement result =
  client.send(msg, "http://localhost:8080/ode/processes/InstanceManagement");

List>ProcessInfo> processes = new ArrayList>ProcessInfo>();
Iterator>OMElement> i = result.getChildElements();

while (i.hasNext()) {
  OMElement omInstanceInfo = i.next();
  OMElement omProcessName =
   omInstanceInfo.getFirstChildWithName(
    new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
    "process-name"));
  OMElement omStatus =
   omInstanceInfo.getFirstChildWithName(
    new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
   "status"));
  OMElement omStarted =
   omInstanceInfo.getFirstChildWithName(
    new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
   "dt-started"));
  OMElement omLastActive =
   omInstanceInfo.getFirstChildWithName(
    new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
   "dt-last-active"));

  ProcessInfo process = new ProcessInfo();
  process.setProcessName(omProcessName.getText());
  process.setStatus(omStatus.getText());
  process.setStarted(omStarted.getText());
  process.setLastActive(omLastActive.getText());
  processes.add(process);
  }

示例將使用 axiom 庫來檢索信息並把它存儲為 ProcessInfo 對象列表。可以從應用程序的任何其他部分使用這些對象。

ODE 事件偵聽程序

ODE 允許您為 ODE 應用程序內的任何操作(例如啟動和停止流程實例)開發偵聽程序。要創建您自己的事件偵聽程序,需要實現 ode-bpel-api.jar 庫中定義的 org.apache.ode.bpel.iapi.BpelEventListener 接口。以下代碼將演示一個輸出到標准輸出流傳入事件的簡單實現和 startup() 及 shutdown() 偵聽程序方法的調用。

清單 4. startup() 和 shutdown() 偵聽程序方法

/**
* {@inheritDoc}
*/
public void onEvent(BpelEvent event) {
  System.out.println(event);
}

/**
* {@inheritDoc}
*/
public void startup(Properties arg0) {
  System.out.println(this.getClass() + " startup");
}

/**
* {@inheritDoc}
*/
public void shutdown() {
  System.out.println(this.getClass() + " shutdown");
  }

當偵聽程序類就緒後,需要把它放到 ODE 類路徑中(您可以把帶有偵聽程序類的 JAR 文件放入 webapps/ode/WEB-INF/lib Tomcat 目錄)。您還需要創建 webapps/ode/WEB-INF/conf/ode-axis2.properties 屬性文件並將下列行添加到其中:

ode-axis2.event.listeners=com.ibm.wd2.bpel.eventlistener.WD2EventListener

您的偵聽程序類名稱可以不同於上面的名稱。

結束語

BPEL V2.0 是一種功能強大的語言,可用於幫助開發由大量其他組件和 Web 服務組成的復雜應用程序。BPEL 允許使用圖形編輯器來描述長期運行的工作流程,從而在人類友好的圖表上展現工作流程。您可以使用開源產品創建使用 Apache 和 Eclipse 社區的 BPEL V2.0 規范的應用程序 —— 可以結合使用兩者,Eclipse BPEL 項目用於開發流程,Apache ODE 用於執行。如上所述,兩個產品至少可以在簡單的 BPEL V2.0 流程上成功運行。但是,在真實業務應用程序中使用這些開源工具之前,建議先在一個更復雜的應用程序上研究這些開源工具的優缺點。

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