例外ハンドラ
では、Javaクラスがスローした例外をjBPM側で補足して処理することはできないのでしょうか?
答えは「できる」です。
これを行うのが、Exception Handler(例外ハンドラ)です。
例外ハンドラは、プロセス定義、ノード、Transitionのいずれに対しても定義できるもので、アクションのリストを持っています。
ここで押さえておきたい点は、「jBPMの例外ハンドラは通常のJavaの例外処理(tryやcatchなど)のように制御フローに影響を与えるものとは異なり、プロセス定義のフロー自体へは影響を与えない」ということです。
例外ハンドラでは、Javaクラスで発生した例外を補足するかどうかについて、例外クラスを指定して決定します。また、補足した場合は例外ハンドラに関連づけられたアクションを呼び出します。
前回説明したようにアクションにはJavaクラスのほかにも、スクリプトやタイマ、e-mail通知がありますので、例外ハンドラで例外を補足した後の処理を柔軟に設計することが可能です。
なお補足しない場合は、先ほど動作確認した通りにプロセス定義を呼び出したクライアントのToken.signal()へ例外を返します。
それではSimpleProcessプロセス定義のstateNodeノードに例外ハンドラを追加作成してみましょう。今回は例外ハンドラに紐付いたアクションとして、別のJavaクラスを作成して利用してみましょう。
jBPMグラフィカルデザイナで前回作成したTestHandler同様にTestExceptionHandlerクラス(リスト3)を作成し、ActionHandlerインターフェースのexecute()メソッドを実装します。
(画像をクリックすると別ウィンドウに拡大図を表示します)
例外ハンドラの指定
次に例外ハンドラを指定して、TestExceptionHandlerクラスを関連付けます。まず、jBPMグラフィカルプロセスデザイナのプロセス定義フィールド上のstateNodeを選択します。下段のPropertiesウィンドウでExceptionsの右側を右クリックで選択し、New Exception Handlerを作成してください。
Exception classには「java.lang.Exception」を入力します。再度、右クリックでNew Actionを選択し、GeneralタブのNameフィールドで適当なAction名を指定します。
次にDetailsタブをクリックします。Detailsタブ上のセレクトボックスでHandlerを選択して、Class Nameに先ほど作成したtest.TestExceptionHandlerクラスを指定します(図1)。これで例外ハンドラを介して、TestExceptionHandlerクラスを呼び出すことができるようになります。
再び「Run → Run as → Java Application」でProcessWorkerクラスを実行してください。うまく実行された場合、jBPMグラフィカルプロセスデザイナ下段のConsoleウィンドウにデバッグ情報と共に、TestExceptionHandlerからのメッセージが表示され、例外ハンドラが動作していることを確認できます。
今回は簡単に動作を確認するためにjava.lang.Exceptionを用いましたが、実際はJavaクラスでアプリケーション例外をスローし、例外ハンドラで補足するという使いかたが一般的です。 次のページ