2011年4月11日月曜日

CompensableActivity による補正処理

例外処理とは微妙に異なりますが、CompensableActivity も近い形の処理モデルを提供しています。Workflow 上にドロップすると次のように展開されます。

Sequence

CompensableActivity が大枠となり、内部に Body、CompensationHandler、ConfirmationHandler、CancellationHandler が用意されます。BODY は処理する内容本体を設定し、ConfirmationHandler は「確認(終了)」時の処理を設定します。このあたりが Workflow 用語なのでイメージしにくいかも知れませんが、簡単に言うと「正常終了時の処理」と似たようなものです。

CompensationHandler は、「補正」時の処理を設定します。ここでいう補正とは、BODY に設定された処理を取り消すような処理の事を表します。ここでプログラムをされている方でしたら、前述の TransactionScope とかでいいのでは?、と思われますが Workflow というものの性質上、1 アクティビティの処理が数時間~数日になることも十分に起こり得ます。そのためトランザクションでここを制御すると常に Workflow エンジンが動作している環境に負担をかけてしまうことになり、あまり望ましくないケースが存在するのです。そのような場合、CompensableActivity の補正処理を利用する形で、処理前(もしくはそれに近い状態)へと戻す処理が必要になります。

CancellationHandler には「キャンセル」時の処理を設定します。キャンセルという動作自体については別の機会に書こうと思います。

このような形で、正常時と異常時の処理を設定するのですが、これに関連して利用するアクティビティがあります。それが Confirm アクティビティと Compensate アクティビティです。名前から何となく想像がつくかと思いますが、Confirm アクティビティは明示的に「確認」処理を行うためのアクティビティで、Compensate アクティビティは明示的に「補正」処理を行うためのアクティビティです。

少し微妙なところは、これら2つのアクティビティは関連する CompensableActivity の外側に配置する必要があるというところです。CompensableActivity は内部処理の結果を保存するための変数を設定する事ができます。Confirm と Compensate 双方のアクティビティはその変数に関連づいた CompensableActivity の処理を呼び出す挙動になります。
通常何も行わなければ無条件で Confirm された場合と同様の動作を行います。Confirm アクティビティを利用するのは、実行する処理内部で条件によって途中で正常終了させるケースになります。

WF4-3

その際の流れを図示すると上記のようになります。外に出てから戻る、という部分が少々感覚的に違和感を覚えるかもしれません。

0 件のコメント:

コメントを投稿