|
ビジネス プロセス例外は、Java ハンドラ メソッドにより捕捉されない Java 例外です。この節では、ビジネス プロセスで例外の処理を行う方法について説明します。内容は以下のとおりです。
デザイン ビューを使用すると、ビジネス プロセス ノード、折り畳み可能なノード グループ、および開始ノード上で例外パスを作成できます。具体的には、デザイン ビューを使用すると、次の例外ハンドラのタイプをビジネス プロセスに作成できます。
一般的に、例外はノードの例外パスから上流に向かって、処理されるまでグループ例外パスへ、またはグローバル例外パスへ伝播します。言い換えると、ノードに関連付けられた例外パスは最初に実行され、グループに関連付けられたパスの実行はその次に、開始ノード (グローバル パス) に関連付けられたパスはその後で実行されます。例外パスが例外を送出しない限り、例外は一度だけ処理され、続いて、例外は同じ順序で再び上流に向かって伝播されます。この動作を利用して、ビジネス プロセスに必要な特定の例外処理を満たす例外パス ロジックを作成できます。詳細については、「例外ハンドラの実行順序」を参照してください。
注意 : | 例外パスは、Decision ノード内の <if> および <default> ブロック、Parallel ノード内の <branch> ブロック、<finish> ノード、<messageEvent> 、<timeoutEvent> 、および <onException> パス自体には適用されません。 |
例外ハンドラ パスを、ビジネス プロセスの個々のノード、およびノードのグループと関連付けることができます。開始ノードと関連付けられた例外パスは、特殊なケースです。すなわち、開始ノードと関連付けられた例外パスはビジネス プロセスのグローバル例外ハンドラです。開始ノードの詳細については、「ビジネス プロセスの開始」を参照してください。この節で説明する手順は、以下のとおりです。
図 15-1 に示すように、例外パスがノードまたはノードのグループに追加されます。
[OnException] をダブルクリックして、新しい名前を入力すると、例外パスの名前を変更できます。プロパティ ビューの [名前] フィールドでも名前を変更できます。
JPD コンフィグレーション ビューに、関連するプロパティが表示されます。Oracle Workshop for WebLogic に [JPD コンフィグレーション] ビューが表示されない場合は、メニューから [ウィンドウ|ビューの表示|その他|一般|JPD コンフィグレーション] を選択します。
注意 : | デフォルトの [プロセス] ビューには [プロパティー] ペインしか表示されていません。[プロセス] パースペクティブで、[JPD コンフィグレーション] ビューと [プロパティー] ペインを同時に使用することはできません。 |
注意 : | [JPD コンフィグレーション] ペインの値を変更するには、まず [プロパティー] ペインを閉じてから、[JPD コンフィグレーション] ペインを開いて JPD を再ロードする必要があります。[プロパティー] ペインに戻るには、[JPD コンフィグレーション] ペインを閉じてから、[プロパティー] ペインを開いて JPD を再ロードします。 |
スキップ - 例外パスが関連付けられたノードまたはグループをスキップします。つまり、例外パスが定義されたノードまたはグループの次のノードからプロセスの実行を再開します。
再開 - 実行は、一番近いトランザクション ブロック、例外ブロック、またはスタックのエラーを発生したノードの後で再開されます。つまり、プロセスの実行は、例外を送出したノードの次のノード (これはグループ内のノード、または、例外を送出したノードがグループの最後のノードの場合は、ノードのグループの次のノード) で再開されます。
再送出 - 例外パス上のノードを実行し、再送出される同じ例外を 1 つ上のレベルの例外ハンドラで処理します。
注意 : | ノードに関連付けられた例外パスがあり、例外が再送出されると (afterExecute="rethrow" )、context_onException() は呼び出されません。 |
execute on rollback パラメータは、例外ハンドラを補正のために使用できるようにします。ノードをグループ化し、execute on rollback プロパティを true に設定して、例外パスをそのグループに追加すると、トランザクションのロールバックの前に例外ハンドラが実行されるように指定できます。これによって、ロールバックにより影響を受けない非トランザクション リソースをクリーンアップする機会を与えます。詳細については、「補正のための例外ハンドラの使用」を参照してください。
afterExecute
パスに入るまでに再試行する回数を指定します。カウンタが評価され、ハンドラ実行の終わりにインクリメントされます。注意 : | retry count を、after execute パラメータを [再開] に設定して指定する場合は、次の動作に注意してください : グループに関連付けられた例外ハンドラで retry count を指定すると、再試行は、エラーを起こしたノードではなく、グループの先頭から開始されます。ただし、after execute プロパティの [再開] オプションも指定すると、すべての再試行回数が使い果たされた後で、実行はエラーが発生したノードの次のグループ内のポイントから続行できます。 |
例外ハンドラ パスを作成すると、デザイン ビューで次のアイコンがノード (またはノードのグループ) の傍に表示され、例外パスが指定したノードに対してアクティブになっていることを示します。
例外ハンドラ (またはメッセージあるいはタイム パス) の表示を折り畳むには、例外パス アイコンのグレー矢印をクリックします。次の図は、パスを折りたたんでいるノードに関連付けられたアイコンを示しています。
警告 : | 例外パスを削除すると、そのパスに定義したビジネス プロセス ノードも削除されます。例外パスを削除しようとすると、続行する前に削除を承認する必要があることを告げる警告メッセージがダイアログ ボックスに表示されます。 |
例外が発生すると、通常の実行フローは停止します。ビジネス プロセスは、実行ポイントに一番近い所で定義されている例外ハンドラ パス内のアクティビティを実行します。
一般的には、複数の例外ハンドラをビジネス プロセスに定義します。次のシーケンスは、例外が送出されたときの実行順序を定義します。
注意 : | after execute プロパティを [再送出] に設定した場合は、例外自体も上流に向かって伝播されます。 |
注意 : | トランザクション ブロック内で例外が発生した場合は、トランザクションはロールバックされ、例外ハンドラは後で呼び出されます。ただし、ビジネス プロセスが、例外ハンドラを後で呼び出す代わりに、freeze on failure に指定されている場合は、プロセスがフリーズし、例外ハンドラが呼び出されることはありません。ここで、トランザクション ブロック内で freeze on failure がコンフィグレーションされている場合は、トランザクション ブロックを使用しないようにするか、トランザクション ブロック内にグローバル トランザクション ロジックを含めないようにする必要があります。8.x では、[2 フェーズ コミットのエミュレート] 付きの [グローバル トランザクションのサポート] はデフォルト設定でしたが、現行リリースでは [グローバル トランザクションのサポート] がデフォルトでオフになっているため、非 XA ドライバを使用している場合は、有効にする必要があります。 |
トランザクション内のノードまたはグループが例外を送出した場合は、トランザクションは、例外が処理されなかったかどうか、または例外ハンドラが例外を送出したかどうかだけを調べます。次のアルゴリズムが例外を処理するために使用されます。
注意 : | トランザクションを「ロールバックのみ」に指定するかどうかは、ビジネス プロセスで使用するトランザクション リソースのタイプによります。 |
注意 : | エラーが発生した場合に直ちにトランザクションにロールバックを強制するトランザクション リソースの場合は、ノードまたはノードのグループ上の例外ハンドラはトランザクションがロールバックするまで実行しません。ただし、例外ハンドラを補正のための execute on rollback プロパティと共に使用すると、非トランザクション リソースをクリーンアップできます。詳細については、「補正のための例外ハンドラの使用」を参照してください。 |
トランザクション リソースとは、Control Request ノードやトランザクション コントロールによりビジネス プロセスと通信するリソースで、データベース、JMS、ワークリスト、タイマー、EJB、メッセージ ブローカ、およびトランスフォーメーションなどがあります。
エラーが発生した場合に直ちにトランザクションにロールバックを強制するトランザクション リソースの場合は、ノードまたはノードのグループ上の例外ハンドラはデフォルトでは実行しません。ただし、ビジネス プロセスの明示的なトランザクション ブロック内に例外パスを配置し、そのパスの execute on rollback プロパティを true に設定すると、例外ハンドラをロールバックが行われる前に強制的に実行させることができます。これにより、例外パスは現在の状態 (プロセス変数など) にアクセスでき、例外パスに追加されたロジックを補正のために使用して、「補正の例」で説明するように、非トランザクション リソースをクリーンアップできます。
Client Request ノードについての詳細は、「ビジネス プロセスでの Client Request ノードの作成」を参照してください。
図 15-2 に、補正のための例外パスの使用方法を示します。
この例では、2 つのノードが同じトランザクションで実行しています。最初のノードはファイル (非トランザクション) に書き込み、二番目のノードがデータベース (トランザクション) を更新します。両方のノードは、関連する例外ハンドラを持ったグループ内にあります。例外ハンドラの execute on rollback プロパティを true に設定すると、ロールバックが行われる前に例外ハンドラを強制的に実行できます。
この例では、データベース処理が失敗し、トランザクションが「ロールバックのみ」に指定されている場合は、次の順序でイベントが発生します。
注意 : | 上記の例は暗黙的なトランザクション用です。明示的なトランザクションでの補正にも同じ技法が使用できます。ただし、例外ハンドラ パスを必ず明示的なトランザクション内に配置してください。明示的なトランザクション自体に配置すると、希望する動作が行われません。図 15-3 に、補正ロジックを持った例外ハンドラ パス付きの明示的なトランザクションの例を示します。 |
ビジネス プロセスの例外を処理しないと、例外は次のいずれかでラップされます。
元の例外を取得する必要がある場合は、未処理のプロセス例外上で getCause()
を呼び出すことができます。このメソッドの詳細については、『Java 2 Platform, Standard Edition, v 1.4.2 API Specification』の「getCause()
」を参照してください。これは次の URL にあります。
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getCause()