BPELプロセスでは、フォルト処理を使用して、Webサービス外部から戻されたエラー・メッセージやその他の例外を処理し、ビジネス・フォルトまたは実行時フォルトに応じてエラー・メッセージを生成できます。次の種類のフォルトが発生する可能性があります。
ビジネス・フォルト: ビジネス・フォルトはアプリケーション固有のフォルトで、invokeアクティビティがレスポンスとしてフォルトを受信した場合、またはアプリケーションがthrowアクティビティを実行した場合に生成されます。ビジネス・フォルトは、現在の従業員のID番号が従業員データベースにない場合など、情報に問題がある場合に発生します。
実行時フォルト: 実行時フォルトは、BPELプロセスで値を不適切に使用しようとした場合、または無限ループなどのロジック・エラーがある場合に生成されます。実行時フォルトは、変数名が正しくないためにデータを適切にコピーできない場合など、BPELプロセスまたはWebサービス自体に問題がある場合に発生します。
図7-23に、フォルト・ハンドラがscopeアクティビティ内に組み込まれている一般的なパターンを示します。scopeアクティビティには、予定外の情報を処理するWebサービスへのinvokeアクティビティが含まれています。
SOA Order Bookingアプリケーションでは、与信検証プロセスで失格となって注文が承認されない場合は、「OrderBookingFault」catchAllブランチがトリガーされます。その後、catchAllでは、注文ステータスが「cancelled」に設定されます。図7-24に、「OrderBookingFault」catchAllを示します。
図7-24 SOAOrderBooking.bpelでのフォルト処理とcatchAllブランチ
フォルト処理スコープ内では、1つ以上のcatchブランチを使用して、フォルトを捕捉および処理します。BPELプロセスでは、throwアクティビティを使用してフォルトを生成します。
catchまたはcatchAllブランチが組み込まれているスコープを使用して、特定のタイプのフォルト(予定外のデータ)を捕捉します。名前が指定されたcatchブランチでは処理されないフォルトを捕捉するには、catchAllブランチを使用します。
catchまたはcatchAllブランチを使用してフォルトを処理する手順は、次のとおりです。
catchまたはcatchAllブランチを追加するスコープを開きます。
「Catchブランチの追加」(または「CatchAllブランチの追加」)アイコンをクリックします。
作成したブランチを開きます。
「Assign」アクティビティをブランチにドラッグ・アンド・ドロップし、「Assign」アイコンをダブルクリックします。
図7-25に示すように、「Assign」ダイアログを使用して、変数および式をコピーします。
「OK」をクリックしてすべてのウィンドウを閉じます。
ファイルを保存します。
BPELプロセス内からフォルトを生成するには、throwアクティビティを使用します。throwアクティビティをBPELプロセスに追加すると、フォルト名およびタイプを出力ペイロードにコピーするコピー・ルールが自動的に挿入されます。throwアクティビティによってスローされるフォルトはBPEL内部のフォルトです。throwアクティビティは、クライアントと通信する非同期プロセスには使用できません。throwアクティビティには、name
、faultName
およびfaultVariable
の3つの要素があります。BPELプロセスは、内部フォルトのスローとは対照的に、別のアプリケーションにフォルトを送信して問題を提示できます。同期操作では、replyアクティビティによってフォルトを戻すことができます。非同期操作では、invokeアクティビティがこの機能を実行します。
throwアクティビティでフォルトを処理する手順は、次のとおりです。
エラーまたは例外メッセージを生成するBPELプロセスで、「Throw」アクティビティをドラッグ・アンド・ドロップします。
「Throw_1」アイコンをダブルクリックします。
図7-26に示すように、「Throw」ダイアログを使用して値を入力します。
「OK」をクリックします。
ファイルを保存します。
faultHandlers
タグには、フォルト処理コードが含まれています。フォルト・ハンドラ内のcatchアクティビティによって、フォルト名と変数、およびcreditRating
変数を「-1000
」に設定するコピー指示が定義されます。フォルトが処理されない場合は、アプリケーションを通じて上位に移行するフォルト状態が作成されるため、プロセス全体をフォルト状態にスローできます。
例7-10に、SOA Order Bookingアプリケーションのcatchブランチを使用したフォルト処理のソース・コードを示します。
例7-10 catchブランチを使用したフォルト処理のソース・コード
<faultHandlers> <catch faultName="client:OrderBookingFault" faultVariable="OrderBookingFault"> <sequence name="Sequence_12"> <scope name="SetOrderStatus"> <variables> <variable name="orderStatusRequest" messageType="ns2:OrdersCollection_msg"/> </variables> <sequence name="Sequence_13"> <assign name="AssignOrderStatus"> <copy> <from variable="inputVariable" part="payload" query="/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ID"/> <to variable="orderStatusRequest" part="OrdersCollection" query="/ns9:OrdersCollection/ns9:Orders/ns9:ordid"/> </copy> <copy> <from expression="string('canceled')"/> <to variable="orderStatusRequest" part="OrdersCollection" query="/ns9:OrdersCollection/ns9:Orders/ns9:status"/> </copy> <copy> <from variable="OrderBookingFault" part="payload" query="/client:SOAOrderBookingProcessFault/client:status"/> <to variable="orderStatusRequest" part="OrdersCollection" query="/ns9:OrdersCollection/ns9:Orders/ns9:comments"/> </copy> </assign> <invoke name="SetFaultedOrderStatus" partnerLink="OrderStatus" portType="ns2:OrderStatus_ptt" operation="update" inputVariable="orderStatusRequest"/> </sequence> </scope> </sequence> </catch> </faultHandlers>
例7-11に、SOA Order Bookingアプリケーションのthrowアクティビティを使用したフォルト処理のソース・コードを示します。
例7-11 throwアクティビティを使用したフォルト処理のソース・コード
<switch name="taskSwitch"> <case condition="bpws:getVariableData('ApproveOrder_globalVariable', 'payload', '/task:task/ task:systemAttributes/task:state') = 'COMPLETED' and bpws:getVariableData('ApproveOrder _globalVariable', 'payload', '/task:task/task:systemAttributes/task:outcome') = 'REJECT'"> <bpelx:annotation> <bpelx:pattern>Task outcome is REJECT</bpelx:pattern> </bpelx:annotation> <sequence> <assign> <copy> <from expression="string('Order has been rejected by manager')"/> <to variable="OrderBookingFault" part="payload" query="/client:SOAOrderBookingProcessFault/client:status"/> </copy> </assign> <throw name="Throw_1" faultName="client:OrderBookingFault" faultVariable="OrderBookingFault"/> </sequence> </case> <case condition="bpws:getVariableData('ApproveOrder_globalVariable', 'payload', '/task:task/task:systemAttributes/task:state') = 'COMPLETED' and bpws:getVariableData('ApproveOrder_globalVariable', 'payload', '/task:task/task:systemAttributes/ task:outcome') = 'APPROVE'"> <bpelx:annotation> <bpelx:pattern>Task outcome is APPROVE</bpelx:pattern> </bpelx:annotation> <sequence> <empty name="Empty_1"/> </sequence> </case> <otherwise> <bpelx:annotation> <bpelx:pattern>Task is outcome is EXPIRED, STALE, WITHDRAWN or ERRORED</bpelx:pattern> </bpelx:annotation> <sequence> <empty name="Empty_2"/> </sequence> </otherwise> </switch>