為簡單起見,本例的Web服務組合只調用一個Web Service API。
本文環境是:Eclipse Juno Release + JRE 1.7 + Tomcat 7.0.29 + BPEL + ODE,Eclipse的安裝,JRE環境變量配置和Tomcat配置本文就不講了。BPEL似乎不能運行於MyEclipse,本人在MyEclipse環境下沒有成功,可能跟端口爭用有關。
網上BPEL入門的文章大都有問題,或比較老而新版本發生了改變,或其中有些在實施中會遇到的問題,本文則是我花兩天時間動手摸索出來的,整理下來以備忘,算是BPEL入門基礎,大牛就不用看了。
1、Apache ODE安裝和配置
從http://ode.apache.org/下載ode的war文件,本例下載的文件是apache-ode-war-1.3.5.zip,解壓這個文件,找到ode.war,放到Tomcat主目錄下的webapps目錄,然后到“Tomcat主目錄\bin”目錄下,啟動Tomcat服務器,成功啟動后,在瀏覽器里輸入http://localhost:8080/ode,如果瀏覽器里顯示如下頁面,則說明ode安裝成功:
2、BPEL Visual Designer安裝
打開Eclipse,點擊菜單“Help->Install New Software...”彈出“Install”對話框,點擊“Add…”按鈕,在彈出的對話框里,Name框里輸入“BPEL”,Location框里輸入http://download.eclipse.org/bpel/site/,輸入完成后點擊“OK”按鈕。
Eclipse自動列出所有可下載安裝的組件,如下圖所示:
選中所有三項“BPEL Commons”、“BPEL Visual Designer”和“Runtime Adapter for Apache ODE 1.3”,然后點擊“Next”,直到安裝完成。
點擊Eclipse菜單“File->New->Other”,在Wizards里輸入“bpel”,如果出現如下三項,則說明BPEL安裝成功:
3、Eclipse ODE服務器配置
盡管可以在創建BPEL工程時創建ODE服務器,但現在仍可以先在Eclipse里配置好ODE服務器,以后使用時更加方便。
Tomcat默認使用的端口號是8080,因此ODE使用8080端口時會有問題,當ODE的宿主服務器Tomcat使用8080端口時,ODE好像也不能使用其它端口而必須使用8080端口。如果服務API和BPEL都在同一台機器上運行,而且都在同一Tomcat目錄下,使用ODE部署BPEL時會出現莫明其妙的問題。初步分析,可能是端口號爭用,通過很多次嘗試,最終找到了解決之道:在另一台機器上使用Tomcat部署服務,在本機上部署BPEL服務組合,另一台機器上的Tomcat和本機的ODE服務器均使用8080端口。
Web Service地址:http://192.168.10.179:8080/Fibonacci/FibonacciPort?WSDL
ODE服務器地址:http://localhost:8080/ode
說明:192.168.10.179不是localhost。
點擊Eclipse菜單“Window->Preferences->Server->Runtime Environments”,點擊“Add”按鈕,在彈出的對話框輸入下圖所示的內容,其中Tomcat目錄為你自己機器上的目錄:
點擊“Finish”按鈕,完成配置。
4、創建BPEL服務組合
第一步,創建 BPEL工程
依次點擊“File->New->Other”,在Wizards里輸入“bpel”,在出現的工程類型中選擇“BPEL Project”,點擊“Next”,在彈出的對話框里輸入工程名稱“BPELFibonacci”,如名稱,本文調用的Web Service的功能是生成Fibonacci數列,服務器選擇“ODE”,如下圖所示:
然后點擊“Next”,最后擊點“Finish”,一個BPEL工程創建完畢。
第二步,創建BPEL Process
在Eclipse的Package Explorer中,右擊BPELFibonacci下的“bpelContent”,在彈出的菜單里選擇“New->Other”,在彈出對話框的Wizards文本框里輸入“bpel”,然后選擇列表中的“BPEL Process File”,點擊“Next”。
Process Name輸入“BPELFibonacci”,Namespace輸入http://bpel.sklse.org,然后點擊“Next”,彈出如下的對話框:
更改Template為同步,即下拉列表選擇“Synchronous BPEL Process”,把Service Address改為http://localhost:8080/ode/processes/BPELFibonacci,其它不變,點擊“Next”按鈕,然后點擊“Finish”按鈕,系統為我們創建了Process文件,並自動打開了流程編輯器。
第三步,將服務的WSDL文件加入工程
不論你用什么方式,請將服務的WSDL文件加入到工程的bpelContent文件夾下,請確保WSDL文件中的地址是可用的,也就是說,可通過瀏覽器訪問到這個WSDL文件。本例中,使用的WSDL文件是FibonacciPort.wsdl。
第四步,編輯Process
不論初始的流程是什么,通過拖拽“Actions”,拖動兩個assign和一個invoke,構成如下圖所示的流程圖:
第四步A,編輯invoke,創建伙伴鏈接
流程的核心是執行服務,伙伴鏈接實際上是指定此流程與哪個服務綁定,被綁定的服務將會被執行。一個服務有輸入和輸出。
此流程只包含最基本的三個部分:輸入、執行和輸出,分別對應“receiveInput和assignInputToSOAPRequest”、“invokeFibonacci”以及“replyOutput和assignOutputToResult”。
選中“invokeFibonacci”,在Eclipse下方打開“Properties”標簽頁(如果沒有,請點擊Eclipse菜單“Window->Show View->Properties”),可看到如下所示的界面:
點擊“Details”,在右邊的面板中點擊“Partner Link”文本框后面的下拉三角,選擇“Create Global Partner Link”,打開創建鏈接對話框,首先輸入伙伴鏈接名稱“BPELFibonacciPL”:
點擊“OK”按鈕,然后選擇鏈接到的Web Service,也就是Fibonacci服務:
選擇來源和過濾條件為“From Project”和“Show Port Types”,在“Matches”里選擇“FibonacciDelegate”,“FibonacciDelegate”的內容會自動出現在“Partner Link Type Structure”下,在這里也選擇“FibonacciDelegate”,然后點擊“OK”按鈕,進入下一步,輸入伙伴鏈接類型名稱:
輸入“BPELFibonacciPLT”,名稱是任意的,然后點擊“Next”按鈕,輸入角色名稱“BPELFibonacciRole”,選中下面的Web服務“FibonacciDelegate”,點擊“Next”,彈出的對話框里什么都不輸入,再點擊一次“Finish”,完成了伙伴鏈接的創建。
完成后,請選擇要執行哪個操作,本例中選擇“getFibonacciArray”,也就是獲取Fibonacci數列,其設置如下圖所示,將輸入焦點定位到“Operation”,然后雙擊右邊的“getFibonacciArray”,會自動生成Input和Output變量,這些變量對應的是getFibonacciArray的輸入和輸入,數據結構與Fibonacci的WSDL中定義的一致。
第四步B,分配輸入和輸出
Fibonacci有兩個Web服務接口,我們選擇的是getFibonacciArray,其輸入是一個整型(int)數字,大於等於1,表示獲取Fibonacci數列的前多少位,輸出是字符串(string)類型。
BPEL Project默認的輸入類型並不是int而是string,因此我們要將輸入類型更改為int,要更改這個類型,必須更改“BPELFibonacciArtifacts.wsdl”文件。
在“Project Explorer”里右擊“BPELFibonacciArtifacts.wsdl”,在彈出的菜單里選擇“Open With->WSDL Editor”,打開WSDL編輯器,如下圖所示:
找到BPELFibonacci下的input,點擊右邊箭頭,在彈出的界面中將input類型string改為int,點擊“保存”。由於輸出是string類型,所以不用更改。然后,我們就可以分配輸入了。
點擊“assignInputToSOAPRequest”,展開其屬性頁,切換到“Details”選項卡,點擊“New”新建一個輸入分配,“From”選擇“input:BPELFibonacciRequestMessage->payload:BPELFibonacciRequest->input:int”,在“To”里選擇“BPELFibonacciPLRequest:getFibonacciArray->parameters:getFibonacciArray->arg0:int”,點擊保存,會提示是否生成默認的輸入,選擇是,然后再點擊保存,這樣就完成了輸入的分配。
同樣對於輸出,要注意的是,從伙伴鏈接的輸出到流程的輸出,如下圖所示:
注意:
最初創建BPEL Process時輸入的Service Address是http://localhost:8080/ode/processes/BPELFibonacci,但是“BPELFibonacciArtifacts.wsdl”文件中最后幾行中記錄的地址是http://localhost:8080/BPELFibonacci,請以文本方式打開“BPELFibonacciArtifacts.wsdl”,並將這地址改為http://localhost:8080/ode/processes/BPELFibonacci。步驟是:
在“Package Explorer”里右擊“BPELFibonacciArtifacts.wsdl”,在彈出的菜單里選擇“Open With->Text Editor”,在打開的編輯器里將如下幾行代碼(通常在最后幾行):
1 <service name="BPELFibonacciService"> 2 <port binding="tns:BPELFibonacciBinding" name="BPELFibonacciPort"> 3 <soap:address location="http://localhost:8080/BPELFibonacci"/> 4 </port> 5 </service>
改為:
1 <service name="BPELFibonacciService"> 2 <port binding="tns:BPELFibonacciBinding" name="BPELFibonacciPort"> 3 <soap:address location="http://localhost:8080/ode/processes/BPELFibonacci"/> 4 </port> 5 </service>
5、部署
右擊“bpelContent”,在彈出的菜單里選擇“New->Other->BPEL Deployment Descriptor”,點擊“Next”,再點擊“Finish”,會自動打開deploy的編輯頁面。
在“Inbound Interfaces(Services)”下的“Associated Port”里選擇“BPELFibonacciPort”,點擊后面的單元格,內容會自動填上。
在“Outbound Interfaces(Invokes)”下的“Associated Port”里選擇“FibonacciPort”,點擊后面的單元格,內容會自動填上。
點擊“保存”。
在“Servers”View里,右鍵菜單選擇“New->Server”,在彈出的對話框里選擇“ODE v1.x Server”,然后“Next”,再“Next”,在此對話框里將“BPELFibonacci”通過“Add”按鈕加入到右邊,點擊“Finish”。
啟動Ode服務器。
6、測試
在“Package Explorer”里右擊“BPELFibonacciArtifacts.wsdl”,在彈出的菜單里選擇“Web Services->Test With Web Services Explorer”,此時會打開瀏覽器,並加載Web服務,點擊“process”,輸入“6”,期待的結果是“1 1 2 3 5 8”,結果如下圖所示:
另一個例子,輸入10,結果如下圖所示: