我只是想知道在Oracle BPEL中,补偿的目的是业务回滚。但是catch可以做几乎相似的事情(除了以完全相反的顺序回滚)。我真的不明白为什么我们仍然需要赔偿?
答案 0 :(得分:0)
在许多情况下,错误处理程序中的手动编码补偿即使不是不可能编写也会非常困难,并且会包含大量重复代码。
想象一下,您有以下过程:
<flow>
<sequence>
<invoke name="I1"/>
<invoke name="I2"/>
</sequence>
<sequence>
<invoke name="I3"/>
<invoke name="I4"/>
</sequence>
</flow>
如果你想进行补偿处理,你只需要为每次调用添加补偿处理程序,你就完成了。
如果您使用错误处理程序,那么您需要以某种方式检查哪些活动已被执行。想象一下I4抛出一个错误。你知道I3已经完成并且需要得到补偿。但是,您不知道I1或I2是否已经启动或完成。您需要摆弄标志作为您需要在隔离活动等上设置的变量。此外,I2,I3和I4的错误处理程序需要包含I1的补偿逻辑。使用补偿处理程序比尝试重新创建它们更清晰,更容易:)