2010年3月8日月曜日

Oracle BPEL 11g/Compensation

Oracle BPEL の Compensation の試し書き。


outerScope と innerScope の二重のスコープで、outerScope に faultHandler、innerScope に compensationHandler を定義するようなつくりにしてみた。

実行の流れとしては、innerScope 内の sayHi でレスポンスに文字列 "Hi!"を書き込んでからスコープを完了した直後、わざと fault を <throw>。この fault は outerScope の <faultHandler > でキャッチされるが、この<catch>節には innerScope の 補償が含まれているため、compensationHandler 内の sayBye が実行されて、レスポンスに "Bye!"が追記される。

これをSoapUI からの実行すると以下のようなレスポンスになる。
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<env:Header>
・・・略
</env:Header>
<env:Body>
<processResponse xmlns="http://xmlns.oracle.com/WorkflowPatternsApp_jws/BasicCflowPrj/CancelTask1Process">
<result>Hi!</result>
<result>Bye!</result>
</processResponse>
</env:Body>
</env:Envelope>


やってみるまで知らなかったけど、fault を投げている throw アクティビティを innerScope の中に入れてしまうと、compensation ハンドラが実行されなくなる。完了したスコープのみが補償対象になり得るというのが、BPEL仕様らしい。

ちなみに workflowpatterns の記述を見ると、BPELではこの Fault とCompensationを使ってCancel Task パターンが実現されるとあるけど、JDeveloper 上のモデルと workflowpatterns サイトの図解が全然似てなくて、なんだかよくわからない。

0 件のコメント:

コメントを投稿