5.6.10 補償アクティビティ
補償処理を実行するアクティビティを定義するアクティビティです。補償アクティビティは,ビジネスプロセス実行中にフォルトが発生した場合に,実行完了していた処理を取り消すときに使用します。
補償アクティビティは,[補償アクティビティ]ダイアログで詳細を定義します。
- 〈この項の構成〉
(1) 定義手順
定義の手順を次に示します。
-
補償アクティビティをキャンバスに配置します。
アクティビティを配置する方法については,「5.4.1 アクティビティを配置する」を参照してください。
-
次のどちらかの方法で[補償アクティビティ]ダイアログを表示させます。
-
キャンバスの補償アクティビティをダブルクリックする
-
キャンバスの補償アクティビティを選択して右クリックし,[設定]を選択する
[補償アクティビティ]ダイアログが表示されます。
-
-
[補償アクティビティ]ダイアログで補償するアクティビティを設定します。
[補償アクティビティ]ダイアログの表示・入力内容の詳細については,マニュアル「サービスプラットフォーム リファレンス」の「1.4.16 補償アクティビティダイアログ」を参照してください。
-
[OK]ボタンをクリックします。
(2) 定義時の注意事項
-
アクティビティ名はビジネスプロセス(スコープ内も含む)内で一意になるように指定してください。
-
アクティビティ名は64バイト以内にしてください。
-
ダイアログの入力フィールドに制御文字は指定しないでください。
-
補償アクティビティは,次のハンドラ内で定義します。
-
補償ハンドラを定義したアクティビティが所属するスコープのフォルトハンドラ
-
補償ハンドラを定義したアクティビティが所属するスコープの補償ハンドラ
-
-
次のアクティビティには補償ハンドラを定義できません。
-
フォルトハンドラまたは補償ハンドラ内で最上位のスコープアクティビティ,およびサービス呼出アクティビティ
-
ビジネスプロセスの最上位のスコープアクティビティ,およびサービス呼出アクティビティ
-
-
補償アクティビティ実行時に,補償ハンドラを起動させるためには,次の条件をすべて満たす必要があります。
-
補償ハンドラが定義されたアクティビティが正常終了状態である
-
補償ハンドラが一度も起動されていない
-
-
ある補償アクティビティが複数のアクティビティに対して補償処理を実行する場合,補償処理の実行順序は,ビジネスプロセスを永続化するかどうかによって,次のように異なります。
-
ビジネスプロセスを永続化しない場合,補償処理はアクティビティが正常終了した順の逆順に実行されます。
-
ビジネスプロセスを永続化する場合,補償処理の実行順序は不定です。
-
-
ビジネスプロセスが構造化されているかの検証でエラーが発生する状態の場合,補償アクティビティダイアログにある[補償するアクティビティ]のコンボボックスの表示が不正となることがあります。
-
BPEL標準規格では,フォルトハンドラおよび補償ハンドラが定義されていない場合,暗黙的にフォルトハンドラおよび補償ハンドラを作成し,ビジネスプロセス内に定義したすべての補償処理を実行するよう規定されています。スコープアクティビティのデフォルトハンドラの設定をONにすると,これらの動作を実行できます。スコープアクティビティのデフォルトハンドラの詳細については,「5.4.5 補償処理を定義する」を参照してください。
(3) 補償範囲の定義
補償範囲とは,補償アクティビティと連結したフォルトハンドラまたは補償ハンドラを設定している,スコープ直下の領域のことです。ただし,フォルトハンドラ内,および補償ハンドラ内は,補償範囲から除外されます。
補償範囲にどこまでのアクティビティが含まれるのか,6つの例を使って説明します。
(a) 基本的なパターン
次の図の場合,「サービス呼出1」および「サービス呼出2」が「補償1」の補償範囲に含まれます。
(b) 補償ハンドラの定義されたアクティビティが,分岐の中にあるパターン
次の図の場合,「分岐開始1」,「無操作1」,「サービス呼出1」,「分岐終了1」および「サービス呼出2」が「補償1」の補償範囲に含まれます。
また,この図のうち,「分岐開始1」「分岐終了1」が並列アクティビティの場合でも,同様に「分岐開始1」,「無操作1」,「サービス呼出1」,「分岐終了1」および「サービス呼出2」が「補償1」の補償範囲に含まれます。
(c) 補償ハンドラの定義されたアクティビティが,繰り返しの中にあるパターン
次の図の場合,「繰り返し1」,「サービス呼出1」および「サービス呼出2」が「補償1」の補償範囲に含まれます。
(d) 補償ハンドラの定義されたアクティビティが,スコープの中にあるパターン
次の図の場合,「補償1」の補償範囲に含まれるのは「スコープ2」と「サービス呼出1」であり,「サービス呼出2」は「補償1」の補償範囲に含まれません。「補償1」の補償範囲は,「スコープ1」直下の領域であるためです。もし「補償1」を起点として「サービス呼出2」の補償ハンドラを起動させたい場合は,「スコープ2」に補償コネクションと補償アクティビティを定義する必要があります。
(e) 補償ハンドラの定義されたアクティビティが,フォルトハンドラ内または補償ハンドラ内にあるパターン
次の図の場合,「補償1」の補償範囲に含まれるのは「スコープ2」と「サービス呼出2」であり,「サービス呼出1」は「補償1」の補償範囲に含まれません。「サービス呼出1」は,「スコープ2」のフォルトハンドラ内に配置されているので,「補償1」の補償範囲から除外されるためです。
また,この図のうち,「スコープ2」と「サービス呼出1」が補償コネクションで連結されている場合でも,同様に「サービス呼出1」は補償範囲に含まれません。
(f) 補償アクティビティがスコープに囲われているパターン
次の図の場合,「サービス呼出1」および「サービス呼出2」が「補償1」の補償範囲に含まれます。
「補償1」がスコープに囲われている場合でも,「サービス呼出1」および「サービス呼出2」は「スコープ1」の直下に配置されているため,補償範囲に含まれます。なお,「補償1」が,分岐アクティビティや並列アクティビティ,繰り返しアクティビティなどに囲われている場合でも,同様に「サービス呼出1」および「サービス呼出2」は「補償1」の補償範囲に含まれます。