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>