エラーアクションの使用
この例では、エラーアクションが指定された通常のJava Actionの使用方法を示します。
以下の開始アクションを実行するとします。
メールの送信
FTPによるリモートへのファイル転送
外部データベースへの行の挿入
これらの開始アクションに対して、Activityノードで以下のエラーアクションを作成します。
開始アクション(PA) | エラーアクション(EA)と設定 |
---|---|
メール送信(PA1) | 無処理Java Action(EA1): [エラー後の動作]設定:[プロセス続行] [対象とするException]設定:[以下で指定したExceptionをcatchする] |
FTPによるリモートへのファイル転送(PA2) | 通知アクション -> メール送信(EA2): [エラー後の動作]設定:[エラー状態へ遷移] [対象とするException]設定:[以下で指定したExceptionをcatchする] |
外部データベースへの行の挿入(PA3) | 接続エラー用のエラーアクション(ログファイルの記述など)(EA3.1): [エラー後の動作]設定:[エラー状態へ遷移] [対象とするException]設定:[以下で指定したExceptionをcatchする] 重複エラー時(データベースエントリがすでに使用されていた場合)のエラーアクション(通知メールの送信など)(EA3.2) [エラー後の動作]設定:[プロセス続行] [対象とするException]設定:[以下で指定したExceptionをcatchする] |
実行中、Java Actionは例外をスローする場合としない場合があります。例外がスローされた場合は、以下のアクションが実行されます。
メール送信(PA1)の実行が失敗した場合:このエラーに対して無処理アクションが定義されています。PA1が指定された例外の1つをスローした場合は、無処理Java Actionが実行されます。このアクションには処理が指定されていないため、何も起こりません。その後、プロセスインスタンスの実行が続行されます。
リモートへのファイル転送(PA2)の実行が失敗した場合:このエラーに対して通知アクションが定義されています。PA2が指定された例外の1つをスローした場合は、通知アクション(通知メールの送信など)が実行されます。その後、プロセスインスタンスがロールバックされ、プロセスインスタンスはエラー状態になります。
外部データベースへの行の挿入(PA3)の実行が失敗した場合:このエラーに対して2つのJava Actionが定義されています。PA3が接続エラー例外をスローした場合は、エラーアクションEA3.1が実行されます。EA3.1はこのエラーを報告し、プロセスインスタンスがロールバックされて、プロセスインスタンスはエラー状態になります。同じデータベースエントリがすでに使用されているためにPA3が例外をスローした場合は、EA3.2がその例外をキャッチし、通知メールを送信し、プロセスインスタンスの実行が続行されます。
注意
PA1、PA2、またはPA3が、エラーアクションの[対象とするException]設定で定義されていない例外をスローした場合は、エラーアクションは実行されず、すべての内部プロセスがロールバックされ、プロセスインスタンスはエラー状態になります。
以下の図は、通常のJava Actionとエラーアクションが実行される様子を示しています。
図12.8 Java Actionとエラーアクションの実行
補償アクションの使用
この例では、通常のJava Actionで補償アクションがどのように機能するかを示します。
補償アクションは、通常の実行パスでは実行されません。補償アクションは、トランザクションがロールバックされた場合に、それ以前の成功したアクション群に対して実行されます。補償アクションは、別のトランザクションで、逆の順序で実行されます。
アクションセット内の各Java Actionに対して、複数の補償アクションを定義できます。
注意
補償アクションを別の補償アクションに対して定義することはできません。補償アクションが例外をスローした場合、プロセスインスタンスは直ちにエラー状態になり、残りの補償アクションの実行は中止されます。
以下の例では、前の例で説明した開始アクションに2つのJava Actionを追加して実行します。
メールメッセージの送信
他のアクション
FTPによるリモートへのファイル転送
他のアクション
外部データベースへの行の挿入
一部の開始アクションに対して補償アクションを作成したとします。補償アクションをいつ実行するかは、アクションリストのどこに配置するかで正確に指定できます。以下の表は、開始アクションに対して指定されている補償アクションを示しています。
開始アクション(PA) | 補償アクション(CA) |
---|---|
メールの送信(PA1) | 別のメールメッセージの送信(元のメール変更に関するお詫びなど)(CA1) |
他のアクション(PA2) | 補償アクションは未定義(CA2) |
FTPによるリモートへのファイル転送(PA3) | FTPサーバからのファイルの削除(CA3) |
他のアクション(PA4) | 補償アクションは未定義(CA4) |
外部データベースへの行の挿入(PA5) | 外部データベースからの行の削除(CA5) |
実行中、Java Actionは例外をスローする場合としない場合があります。実行時には、以下のアクションが実行されます。
通常の実行:通常の実行では、ステップ1で指定したJava Actionが実行されます。ステップ2で指定した補償アクションは飛ばされて無視されます。
エラーが発生した場合の実行:たとえば、PA4が例外をスローするとします。まず、定義されている補償アクションが新しいトランザクションで実行されます。例外がスローされる前に正常に実行されたJava Action群に対して定義されているすべての補償アクションが、逆の順序で呼び出されます。この例では、FTP転送(CA3)の補償アクションが実行され、次にメール送信(CA1)の補償アクションが実行されます。2つめの開始アクション(PA2)に対して補償アクションは定義されていません。最後に、トランザクション全体がロールバックされます。ただし、これはInterstage BPMアプリケーションサーバのコンテキスト内の変更にのみ影響します。
注意
成功したアクションだけを補償できます。たとえば、PA5が失敗した場合は、CA3およびCA1だけが実行されます。
以下の図は、通常のJava Actionと補償アクションの実行を示しています。
図12.9 通常のJava Actionと補償アクションの実行
エラーアクションと補償アクションの使用
この例では、Java Actionが例外をスローした場合に、エラーアクションおよび補償アクションがどのように実行されるかを示します。
以下の例では、2つのJava ActionからなるJava Actionセット(開始アクションセットなど)を作成しています。
Java Action 1:Java Action 1(JA1)を使用して、外部データベースを更新します。このJava Actionには、1つのエラーアクションセットと1つの補償アクションセットが割り当てられています。エラーアクションセットには1つのエラーアクションが含まれ、補償アクションセットには2つの補償アクションが含まれます。
Java Action 2:Java Action 2(JA2)を使用して、Web Serviceを呼び出します。このJava Actionには、3つのエラーアクションを含む1つのエラーアクションセットが割り当てられています。このJava Actionには、補償アクションは定義されていません。
図12.10 エラーが発生した場合のJava Actionの実行
実行時には、以下のアクションが実行される可能性があります。
アクション1:通常の実行では、2つのJava Action(JA1とJA2)が連続して実行されます。実行時にエラーは発生しません。
アクション2:JA1(外部データベースの更新)は、例外(FileNotFoundExceptionなど)をスローします。この例外に対してエラーアクションは定義されていないため、プロセスインスタンスはエラー状態になります。
アクション3:JA1(外部データベースの更新)は、例外をスローします。この例では、NullPointerExceptionが発生します。この例外に対してエラーアクションが定義されているため、エラーアクションセットに含まれる無処理エラーアクションが実行されます。例外がキャッチされ、プロセスインスタンスが続行されます。
アクション4:JA1(外部データベースの更新)は正常に実行され、JA2(Web Serviceの呼び出し)はIOExceptionをスローします。スローされた例外はExceptionのサブクラスであるため、「代わりのWeb Serviceの呼び出し」および「メール送信」エラーアクションが実行されます。アクション3と同様に、例外がキャッチされ、プロセスインスタンスが続行されます。
アクション5:JA1(外部データベースの更新)は正常に実行され、JA2(Web Serviceの呼び出し)はNullPointerExceptionをスローします。この例外は、Exceptionのサブクラスなので、Logging an error(エラーの記録)およびSending an email message(メールメッセージ送信)エラーアクションが実行されます。ただし、[エラー状態へ遷移]設定は[プロセス続行]設定よりも優先されるため、この例外はキャッチされません。したがって、最初に2つのエラーアクションが実行されます。その後、JA1の2つの補償アクションが実行されます。最後に、プロセスインスタンスがエラー状態になります。