Hitachi

Cosminexus V11 BPM/ESB基盤 サービスプラットフォーム 開発ガイド 基本開発編


5.4.5 補償処理を定義する

補償処理とは,ビジネスプロセス実行中にフォルトが発生した場合に,実行完了していた処理を打ち消す処理のことです。

補償処理の定義には,次の2つの方法があります。運用に合わせてどちらかの方法を選択してください。

それぞれの詳細を次に示します。

〈この項の構成〉

(1) 任意のアクティビティに,明示的に補償処理を定義する

補償処理の定義手順と,補償処理の定義例について次に示します。

(a) 補償処理の定義手順

補償処理の定義手順を次に示します。

  1. スコープアクティビティを配置します。

    操作の詳細は次の個所を参照してください。

  2. スコープアクティビティの中に,補償処理の対象となるアクティビティと,補償処理を実行するアクティビティを配置します。

  3. 手順2.のアクティビティを補償コネクションで連結します。

    アクティビティの連結方法については,「5.4.2(2) 連結の設定方法」を参照してください。また,補償コネクションを利用できるアクティビティについては,「5.4.2(5) アクティビティの連結条件」を参照してください。

  4. スコープアクティビティと同一の階層に戻り,補償アクティビティを配置します。

  5. スコープアクティビティと補償アクティビティをフォルトコネクションで連結します。

  6. 補償アクティビティをダブルクリックします。

    [補償アクティビティ]ダイアログが表示されます。

    [補償アクティビティ]ダイアログの入力・表示内容の詳細については,マニュアル「サービスプラットフォーム リファレンス」の「1.4.18 補償アクティビティダイアログ」を参照してください。

  7. 補償するアクティビティを設定します。

    [補償するアクティビティ]ラジオボタンで,次のどちらかを選択します。

    • 「すべて」:補償範囲内に存在する,補償ハンドラが定義されたすべてのアクティビティに対し,補償処理を実行します。なお,スコープアクティビティのデフォルトハンドラの設定がONの場合,補償範囲内のスコープアクティビティに暗黙的に定義される補償ハンドラも対象に含みます。補償範囲の詳細については「5.6.10(3) 補償範囲の定義」を参照してください。

    • 「1つのみ」:コンボボックスで選択したアクティビティに対し,補償処理を実行します。なお,スコープアクティビティのデフォルトハンドラの設定がONの場合,選択したスコープアクティビティの補償範囲内で暗黙的に定義される補償ハンドラも対象に含みます。

  8. [OK]ボタンをクリックします。

(b) 補償処理の定義例

補償処理の定義例について,図を使って説明します。

次の図に示すとおり,「サービス呼出1」には補償処理として「サービス呼出1のキャンセル」,「サービス呼出2」には補償処理として「サービス呼出2のキャンセル」のように,各アクティビティに補償処理をそれぞれ定義すると,これらの補償処理をまとめて「補償1」の補償範囲に含められます。1つの補償アクティビティの実行を契機に,複数の補償処理がまとめて実行されるので,補償アクティビティでの定義が簡単にできます。

図5‒5 1つの補償アクティビティで複数の補償処理をまとめて実行する場合の定義例と,アクティビティの遷移

[図データ]

図で示したアクティビティの遷移の詳細を,処理が正常終了した場合と,処理の実行中にフォルトが発生した場合に分けて説明します。なお,図中の矢印や部品に付記した番号は,説明文の番号に対応しています。

処理が正常終了した場合のアクティビティの遷移

1-1. 「受付1」を実行し,「スコープ1」へ遷移する。

1-2. 「スコープ1」を実行し,「サービス呼出1」へ遷移する。

1-3. 「サービス呼出1」を実行し,「サービス呼出2」へ遷移する。

1-4. 「サービス呼出2」を実行し,「サービス呼出3」へ遷移する。

「サービス呼出2」でフォルトが発生した場合のアクティビティの遷移

2-1. 「サービス呼出2」でフォルトが発生し,「スコープ1」のフォルトハンドラでキャッチする。

2-2. 「補償1」で「サービス呼出1のキャンセル」のアクティビティを呼び出し,実行する。

「サービス呼出3」でフォルトが発生した場合のアクティビティの遷移

3-1. 「サービス呼出3」でフォルトが発生し,「スコープ1」のフォルトハンドラでキャッチする。

3-2. 「補償1」で「サービス呼出1のキャンセル」と「サービス呼出2のキャンセル」のアクティビティを呼び出し,実行する。

(2) スコープアクティビティのデフォルトハンドラの設定をONにし,すべてのスコープアクティビティに対して暗黙的に補償処理を定義する

ここでは次の内容を説明します。

(a) スコープアクティビティのデフォルトハンドラの設定をONにする手順

スコープアクティビティのデフォルトハンドラの設定をONにする手順を次に示します。

  1. ツリービューのサービス定義一覧で表示されたサービスから,該当するビジネスプロセスを選択し,ダブルクリックします。

    選択したビジネスプロセスのビジネスプロセス定義画面が表示されます。

  2. プロパティービューの[スコープアクティビティのデフォルトハンドラ]をONに変更します。

(b) 暗黙的な補償処理の動作例

スコープアクティビティのデフォルトハンドラの設定をONにすると,補償処理が暗黙的に定義されます。暗黙的に定義された補償処理がどのように動作するか,例を使って説明します。

例として使用するフォルト発生時の状態を次の図に示します。

図5‒6 暗黙的な補償処理の動作例

[図データ]

図で示したとおり,「データ変換1」でフォルトが発生すると,「サービス呼出2」「サービス呼出1」で次のように補償処理が実行されます。

  1. 「データ変換1」でフォルトが発生する。

  2. 「スコープ2」に暗黙的に定義されているフォルトハンドラが起動する。

  3. 2.のフォルトハンドラの補償アクティビティが,「スコープ2」内の補償ハンドラの起動を実行する。

  4. 「サービス呼出2」の補償ハンドラが起動し,「キャンセル2」を実行する。

  5. 2.のフォルトハンドラのフォルト送出アクティビティが,上位のスコープアクティビティにフォルトを送出する。

  6. 「ルートスコープ」のフォルトハンドラでフォルトをキャッチする。

  7. 「補償1」が実行され,「ルートスコープ」内の補償ハンドラの起動を実行する。

  8. 7.によって「スコープ2」に暗黙的に定義されている補償ハンドラを起動しようとするが,「スコープ2」がフォルト発生状態のため,補償ハンドラが起動しない。

  9. 同じく7.によって「スコープ1」に暗黙的に定義されている補償ハンドラの起動を実行する。「スコープ1」は正常終了の状態で,かつ補償処理が実行されていないため,補償ハンドラが起動する。

  10. 9.の補償ハンドラの補償アクティビティが,「サービス呼出1」内の補償ハンドラの起動を実行する。

  11. 「サービス呼出1」の補償ハンドラが起動し,「キャンセル1」を実行する。

(c) スコープアクティビティのデフォルトハンドラに関する注意事項

  • ビジネスプロセスの最上位に,複数のスコープアクティビティが存在する場合,最上位で発生したフォルトは,スコープアクティビティのデフォルトハンドラでキャッチできません。ビジネスプロセスの最上位に,複数のスコープアクティビティが存在する場合で,次のように運用したいときの対処を示します。

    想定する運用

    次の条件に当てはまるビジネスプロセス内のすべてのアクティビティを補償したい。

    ・正常終了している

    ・補償ハンドラが定義されている

    対処

    ビジネスプロセスの最上位に1つだけスコープアクティビティを配置し,その配下にアクティビティを定義する。

  • スコープアクティビティのデフォルトハンドラの設定をONにした状態で,ビジネスプロセス内のスコープアクティビティに,catch-allを指定したフォルトハンドラを定義した場合,スコープアクティビティのデフォルトハンドラによる暗黙的なフォルトハンドラは定義されません。また,同様に補償ハンドラを定義した場合も,スコープアクティビティのデフォルトハンドラによる暗黙的な補償ハンドラは定義されません。

    これらの仕様のため,次の条件が重なると,スコープアクティビティのデフォルトハンドラが動作しなくなり,ユーザの意図どおりに補償処理が実行されないおそれがあります。

    • スコープアクティビティのデフォルトハンドラの設定をONにした状態である

    • ビジネスプロセス内のスコープアクティビティに,フォルトハンドラまたは補償ハンドラを明示的に定義する