下面是<sequence>的实例,表示必须<receive>完成之后,<reply>才能开始,程序如下:
|
<bpel:sequence> <bpel:receive name="request" partnerLink="HouseLoanBroker" portType="tns:HouseLoanBroker" operation="getLoanQuote" variable="request" createInstance="yes"> </bpel:receive> <bpel:reply name="response" partnerLink="HouseLoanBroker" portType="tns:HouseLoanBroker" operation="getLoanQuote" variable="response" /> </bpel:sequence> |
下面是<flow>的实例,如果按照下面的写法,表示可以同时调用Bank0和Bank1的服务,程序如下:
|
<bpel:flow> <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" /> <bpel:invoke name="bank1" partnerLink="Bank1" portType="bk:Bank" operation="getLoanQuote" inputVariable="bk-loanquote-request" outputVariable="bk-loanquote-response-1" sm:endpoint="urn:sample:soa:bank:Bank1:bank" /> </bpel:flow> |
<link> /<source>/<target>(链接/源/目标)
对于比较复杂的并行的流程,通过链接的定义使得流程能从一个活动跳转到另一个活动。每个<link>链接都会定义一个<source>源和一个<target>目标;如果链接<source>源的转换条件满足的话,将会跳到链接<target>源所在的活动;可以通过transitionCondition来给<source>加上转换条件,如果不加条件,那么认为是true。
下面将房屋贷款的实例做一点改造来说明这个用法。首先定义两个链接“invoke-bank0”和“invoke-bank1”,它们的<source>源都放在<bpel:assign>的活动中。并通过transitionCondition分别给这两个链的源接加上跳转的条件。如果invoke-bank0的源的条件transitionCondition满足的话(即房屋数量为0),它将会跳转到invoke-bank0的目标所在的活动,即invoke Bank0的活动;同理,如果invoke-bank1的源的transitionCondition转换条件(即房屋数量为1)满足的话,它将会跳转到invoke-bank1的目标所在的活动,即invoke Bank1的活动。
|
<bpel:flow> <links> <link name="invoke-bank0"/> <link name="invoke-bank1"/> </links> <bpel:assign> <bpel:copy> <bpel:from variable="ca-housenumber-response" part="payload" query="/ca:getHouseNumberResponse/ca:housenumber" /> <bpel:to variable="bk-loanquote-request" part="payload" query="/bk:getLoanQuoteRequest/bk:housenumber"/> </bpel:copy> <source linkName="invoke-bank0" transitionCondition="getVariableData('bk-loanquote-request', 'payload', '/bk:getLoanQuoteRequest/bk:housenumber') = 0 "/> <source linkName="invoke-bank1" transitionCondition="getVariableData('bk-loanquote-request', 'payload', '/bk:getLoanQuoteRequest/bk:housenumber') = 1 "/> </bpel:assign> <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" > <target linkName="invoke-bank0"/> </bpel:invoke> <bpel:invoke name="bank1" partnerLink="Bank1" portType="bk:Bank" operation="getLoanQuote" inputVariable="bk-loanquote-request" outputVariable="bk-loanquote-response-1" sm:endpoint="urn:sample:soa:bank:Bank1:bank" > <target linkName="invoke-bank1"/> </bpel:invoke> </flow> |
<pick> /< onMessage>/ <onAlarm>(选择/监听/闹钟)
前面所定义的<receive>是整个BPEL流程的一个起点,BPEL引擎处于一种等待接收客户消息的状态。
BPEL也可以提供另外一种功能,它可以把接收请求消息作为一种活动来处理,请求消息这个活动只是在某段时间有效,过了这段时间,这个请求消息活动就停止了。
这种情形在现实生活中很多。我们经常可以看到“报名从什么时间开始,截止到什么时间”等。BPEL是通过<pick>、<onMessage>、<onAlarm>.来实现此功能的。
下面是修改的房屋贷款的实例。
<onAlarm for="'P15DT10H' ">先将报警闹钟设为15天10小时。在这个时间之内,<onMessage>都会接收房屋贷款的请求消息,调用Bank服务,将结果返回给客户。一旦过了此时间,就不会再接收房屋贷款的请求消息了。
|
<bpel:pick createInstance="no" name="house-loan"> <bpel:onMessage name="request" partnerLink="HouseLoanBroker" portType="tns:HouseLoanBroker" operation="getLoanQuote" variable="request"> …… <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" /> …… <bpel:reply name="response" partnerLink="HouseLoanBroker" portType="tns:HouseLoanBroker" operation="getLoanQuote" variable="response" /> </bpel:onMessage> <onAlarm for="'P15DT10H' "> <empty/> </onAlarm> </bpel:pick> |