使用BPEL创建Web服务组合
为简单起见,本例的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,结果如下图所示: