BPEL流程的本质就是通过BPEL的活动(Activity)将BPEL的过程组件“串起来”。所谓“串起来”就是通过BPEL的活动让BPEL的过程组件产生一种动态的交互。比如说将一个变量赋值给另外一个变量,就是一种变量之间的动态的交互。
BPEL流程中经常用到的一些组件如下:
1) 合作伙伴连接(Partner Links);
2) 变量Varaibles;
3) 相关集Correlation Sets;
4) 错误处理Fault handles;
5) 补偿处理(Compensation Handlers)等。
合作伙伴连接(Partner Links)
合作伙伴连接(Partner Links)是指在BPEL中的服务提供者,它主要分为两种,一种是BPEL流程所要调用的外部服务;另一种是指BPEL自己所要提供的服务。
定义合作伙伴连接(Partner Links)实际上包括定义两件事情:
1、在BPEL中定义<partnerLink>
2、在对应的WSDL中定义<partnerLinkType>
BPEL首先需要定义合作伙伴的<partnerLink>,然后需要在所要引入的WSDL中定义所对应的WSDL接口PortType。
1.在BPEL中定义<partnerLink>
如上面的实例在BPEL文件中定义Bank0这么一个partnerLink:
| <bpel:partnerLink partnerRole="BankService" name="Bank0" partnerLinkType="bk:BankPL"/> |
如果是外部服务,需要采用partnerRole来定义合作伙伴类型,如上例中:
| <bpel:partnerLink partnerRole="BankService" name="Bank0" partnerLinkType="bk:BankPL"/> |
如果是BPEL自己的接口,则通过myRole来定义了一个合作伙伴,它表示这个服务接口是BPEL自己提供服务的,如前面实例:
| <bpel:partnerLink myRole="HouseLoanBrokerService" name="HouseLoanBroker" partnerLinkType="tns:HouseLoanBrokerPL"/> |
2.在对应的WSDL中定义< partnerLinkType >
为了使合作伙伴能够对应相应的WSDL的接口,需要在对应的bank.wsdl里面通过<partnerLinkType>定义它所对应的WSDL的portType:
| <plnk:partnerLinkType name="BankPL"> <plnk:role name="BankService" portType="tns:Bank" /> </plnk:partnerLinkType> |
上面就将BPEL的partnerLinkTyp(BankPL)和WSDL的portType(Bank)对应上了。
BPEL是通过合作伙伴的名字来调用<invoke>外部服务的,BPEL引擎也是通过合作伙伴的名字来和真正的服务提供者进行绑定的,如前面的实例将通过“Bank0”来调用外部的Bank0服务。
| <bpel:invoke name="bank0" partnerLink="Bank0" portType="bk:Bank" operation="getLoanQuote" inputVariable="bk-loanquote-request" outputVariable="bk-loanquote-response-0" sm:endpoint="urn:sample:soa:bank:Bank0:bank" /> |
变量Variables
BPEL里面的变量Varaibles类似于Java的变量的概念,是一个保存数据的地方。但是BPEL和Java语言不太一样,Java语言的参数可以直接调用,比方说,Java程序的其他函数接口可以直接调用上面的double parameter1。但是作为BPEL语言是不行的。因为BPEL需要集成WSDL定义的Web Service。同一个参数名字在不同的WSDL中参数是不一样的,因为WSDL是一种XML结构,其本质是一种树状的数据结构,直接赋值是赋不进去的,所以需要先定义变量。一般来说对每一个合作伙伴,不管有多少输入参数和输出参数,定义两个变量即可,一个请求(request)变量,一个响应变量。
| <bpel:variables> <bpel:variable name="request" messageType="tns:getLoanQuoteRequest" /> </bpel:variables> |
上面房屋贷款中的变量实例,可以通过messageType将WSDL文件中的变量类型取过来,如上面的变量“request”实际上对应houseloanbroker.wsdl所定义的变量,结构如下: 数据挖掘研究院
getLoanQuoteRequest
|?D?Dname(String)
这样,通过messageType可以直接定义变量的数据结构。
数据挖掘研究院

