7.26. 例外処理の例
Time-out: EsbActionHandler アクションを使用し、ノードがコールバックを待機している場合は、待機期間を制限できます。これを行うには、ノードにタイマーを追加します。(これは、以下のプロセス定義スニペットで Service1 を設定する方法です。) タイマーは一定期間(この場合は 10 秒)に設定できます。
<node name="Service1">
<action class=
"org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
<esbCategoryName>MockCategory</esbCategoryName>
<esbServiceName>MockService</esbServiceName>
</action>
<timer name='timeout' duedate='10 seconds'
transition='time-out-transition'/>
<transition name="ok" to="Service2"></transition>
<transition name="time-out-transition" to="ExceptionHandling"/>
</node>
Service1 には、2 つの送信移行があります。最初のものは ok です。2 番目のものは time-out-transition です。
通常、call-back はデフォルトの遷移(最初の移行として定義されているため)に問題はありません。
ただし、サービスの処理に 10 秒かかると、タイマーが代わりに実行されます。タイマーの transition 属性は time-out-transition に設定されます。つまり、この移行はタイムアウト時に取られます。
処理は
ExceptionHandling ノードで終了します。ここから、補正作業を実行できます。
例外移行: exceptionTransition を定義して、処理中のサービス midst で発生した例外を処理できます。これにより、メッセージに faultTo エンドポイント参照が設定されます。つまり、Enterprise Service Bus はこのノードにコールバックします。これは exceptionTransition を通知します。
Service2 には 2 つの送信移行があります。通常、問題の発生時に ok 移行が行われます。名前が示すように、処理中に 例外 を出力するため、サービスがあるときに例外が発生します。
<node name="Service2">
<action class=
"org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
<esbCategoryName>MockCategory</esbCategoryName>
<esbServiceName>MockService</esbServiceName>
<exceptionTransition>exception</exceptionTransition>
</action>
<transition name="ok" to="Service3"></transition>
<transition name="exception" to="ExceptionHandling"/>
</node>
Service2 の前述の定義では、アクションの exceptionTransition は exception に設定されています。このシナリオでは、プロセス自体は ExceptionHandling ノードでも終了します。
例外の決定: Service3 の設定と、それに続く exceptionDecision ノードを確認します。Service3 プロセスは通常の結論に処理され、そのノードから移行は予想通りに行われます。
ただし、サービスの実行中に
errorCode が設定され、exceptionDecision ノードは、ここで同じ名前の変数が呼び出されたかどうかを確認します。
<node name="Service3">
<action class=
"org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
<esbCategoryName>MockCategory</esbCategoryName>
<esbServiceName>MockService</esbServiceName>
<esbToBpmVars>
<mapping esb="SomeExceptionCode" bpm="errorCode"/>
</esbToBpmVars>
</action>
<transition name="ok" to="exceptionDecision"></transition>
</node>
<decision name="exceptionDecision">
<transition name="ok" to="end"></transition>
<transition name="exceptionCondition" to="ExceptionHandling">
<condition>#{ errorCode!=void }</condition>
</transition>
</decision>
esbToBpmVars マッピング要素は、メッセージのボディーから SomeExceptionCode を呼び出し、JBPM コンテキスト で設定します。(これは SomeExceptionCode が設定されていることを前提としています。)
exceptionDecision という名前の次のノードでは、処理が正常であれば ok 移行が実行されますが、JBPM コンテキストで errorCode という変数が見つかると、代わりに exceptionCondition 遷移が取得されます。
このようにシステムを設定するには、JBPM の デシジョンノード 機能を使用する必要があります。条件内で複数の移行をネスト化できます。
<condition>#{ errorCode!=void }</condition>
注記
条件移行の詳細は、 JBPM Reference Guide を参照してください。