<compensationhandlers>
構文
<scope>
<throw fault='"BuyersRegret"'/>
<faulthandlers>
<catch fault='"BuyersRegret"'>
<compensate target="RestoreBalance"/>
</catch>
</faulthandlers>
<compensationhandlers>
<compensationhandler name="RestoreBalance">
<assign property='context.MyBalance' value='context.MyBalance+1'/>
</compensationhandler>
</compensationhandlers>
</scope>
要素
要素 | 目的 |
---|---|
<compensationhandler> | ゼロ個以上の <compensationhandler> 要素を <compensationhandlers> コンテナ内に配置できます。各 <compensationhandler> 要素には、以前の処理を元に戻すための一連の BPL アクティビティが含まれます。 |
説明
ビジネス・プロセス管理では、一部のロジック・セグメントを元に戻す必要が頻繁に生じます。この処理を “補償” といいます。原則として、ビジネス・プロセスが何かを実行する場合、その操作を取り消すことができなければなりません。つまり、エラーが発生した場合、ビジネス・プロセスは失敗した操作を元に戻すことによって、そのエラーを補償できる必要があります。障害発生時点以降のすべての操作を取り消し、問題が発生しなかった場合と同じ状態に戻す必要があります。BPL では、補償ハンドラと呼ばれるしくみによってこれを実現します。
BPL <compensationhandler> ブロックはサブルーチンに似ていますが、一般的なサブルーチン・メカニズムを備えていません。これらのブロックを “呼び出す” ことは可能ですが、必ず <faulthandler> ブロックから呼び出すこと、かつ、必ずその <compensationhandler> ブロックと同じ <scope> 内から呼び出すことが条件となります。<compensate> 要素から <compensationhandler> ブロックを呼び出すときは、ターゲットとしてその名前を指定します。この構文では、引用符を追加する必要がありません。
<compensate target="general"/>
補償ハンドラが役に立つのは、既に実行されている処理を元に戻せる場合だけです。例えば、預金を間違った口座に振り替えた場合、元の口座に振り替え直すことは可能ですが、元どおりの状態にできない処理もあります。したがって、適切な補償ハンドラを計画し、どの程度後退するのかに応じて、それらの補償ハンドラを構成する必要があります。
詳細は、"BPL のエラー処理" を参照してください。
<compensationhandlers> と <faulthandlers> の順序を逆にすることはできません。これら両方のブロックを記述する場合は、最初に <compensationhandlers>、次に <faulthandlers> を配置する必要があります。
<compensationhandler> 属性と要素
属性または要素 | 説明 |
---|---|
name、disabled、xpos、ypos、xend、yend 属性 | "一般的な属性と要素" を参照してください。 |
<annotation> 要素 |
関連項目
<catch>、<catchall>、<compensate>、<faulthandlers>、<scope>、<throw>