bpel的compensationhandler标签的涵义
发布网友
发布时间:2022-07-15 07:16
我来回答
共1个回答
热心网友
时间:2023-11-24 17:12
补偿处理(Compensation Handlers)
BPEL流程需要处理一系列的业务流程活动,业务流程往往有这样的业务需求,如果某一个活动出现异常后,希望它前面的活动也能够取消。
以上面的房屋贷款的实例来说,假如房屋贷款的BPEL流程已经调用了外部银行Bank的贷款服务,得到了相应的首付和贷款利率,银行那边也有了相应的记录;但是BPEL流程将Bank的响应结果返回给客户时,出现了异常。这个时候BPEL流程就需要通知Bank取消相应的银行贷款记录。这就需要用到BPEL的补偿处理机制。
继续以房屋贷款为例来说明这个问题。
补偿处理机制是在一定的范围内进行的,因为要对银行贷款服务进行补偿,先用<scope>定义一个范围。此外,需要银行不仅有前面的“getLoanQuote”的贷款功能的接口操作,同时Bank也需要提供一个取消房屋贷款的接口操作,这里假设已经有了这么一个接口操作,名为“canelLoanQuote”。
定义补偿的具体过程是先定义一个<scope>,此处为"bank-loan-scope";再定义<compensationHandler>,并在里面定义相应的活动,如这里的活动为<invoke>取消贷款的操作(Operation)="canelLoanQuote",程序如下所示:
<scope name="bank-loan-scope">
<compensationHandler>
<bpel:invoke name="bank0" partnerLink="Bank0"
portType="bk:Bank" operation="canelLoanQuote"
inputVariable="bk-loanquote-request"
outputVariable="bk-loanquote-response-0"
sm:endpoint="urn:sample:soa:bank:Bank0:bank" >
</bpel:invoke>
</compensationHandler>
<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>
</scope>
此外需要在BPEL的接口中定义WSDL返回消息给客户时的异常,假设为“ReplyFault”,当BPEL流程截获这个异常时,将会调用所表明范围内的补偿机制,补偿机制会进一步调用银行的取消贷款的操作,下面是BPEL的异常处理程序片段。
<bpel:faultHandlers>
<bpel:catch faultName="ca: ReplyFault ">
<bpel:sequence>
<compensate scope="bank-loan-scope"/>
</bpel:sequence>
</bpel:catch>
</bpel:faultHandlers>
参考资料:http://dev.yesky.com/241/7754241_2.shtml