ヘッダーをスキップ
Oracle SOA Suite開発者ガイド
10g(10.1.3.1.0)
B31839-01
  目次へ
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

7.10 フォルト処理

BPELプロセスでは、フォルト処理を使用して、Webサービス外部から戻されたエラー・メッセージやその他の例外を処理し、ビジネス・フォルトまたは実行時フォルトに応じてエラー・メッセージを生成できます。次の種類のフォルトが発生する可能性があります。

図7-23に、フォルト・ハンドラがscopeアクティビティ内に組み込まれている一般的なパターンを示します。scopeアクティビティには、予定外の情報を処理するWebサービスへのinvokeアクティビティが含まれています。

図7-23 フォルト処理

図7-23の説明は次にあります。
「図7-23 フォルト処理」の説明

SOA Order Bookingアプリケーションでは、与信検証プロセスで失格となって注文が承認されない場合は、「OrderBookingFault」catchAllブランチがトリガーされます。その後、catchAllでは、注文ステータスが「cancelled」に設定されます。図7-24に、「OrderBookingFault」catchAllを示します。

図7-24 SOAOrderBooking.bpelでのフォルト処理とcatchAllブランチ

図7-24の説明は次にあります。
「図7-24 SOAOrderBooking.bpelでのフォルト処理とcatchAllブランチ」の説明

7.10.1 フォルトの処理方法

フォルト処理スコープ内では、1つ以上のcatchブランチを使用して、フォルトを捕捉および処理します。BPELプロセスでは、throwアクティビティを使用してフォルトを生成します。

7.10.1.1 catchまたはcatchAllブランチを使用したフォルトの処理

catchまたはcatchAllブランチが組み込まれているスコープを使用して、特定のタイプのフォルト(予定外のデータ)を捕捉します。名前が指定されたcatchブランチでは処理されないフォルトを捕捉するには、catchAllブランチを使用します。

catchまたはcatchAllブランチを使用してフォルトを処理する手順は、次のとおりです。

  1. catchまたはcatchAllブランチを追加するスコープを開きます。

  2. 「Catchブランチの追加」(または「CatchAllブランチの追加」)アイコンをクリックします。

  3. 作成したブランチを開きます。

  4. 「Assign」アクティビティをブランチにドラッグ・アンド・ドロップし、「Assign」アイコンをダブルクリックします。

  5. 図7-25に示すように、「Assign」ダイアログを使用して、変数および式をコピーします。

    図7-25 フォルト・ハンドラの一部であるassignアクティビティ

    図7-25の説明は次にあります。
    「図7-25 フォルト・ハンドラの一部であるassignアクティビティ」の説明

  6. 「OK」をクリックしてすべてのウィンドウを閉じます。

  7. ファイルを保存します。

7.10.1.2 throwアクティビティを使用したフォルトの処理

BPELプロセス内からフォルトを生成するには、throwアクティビティを使用します。throwアクティビティをBPELプロセスに追加すると、フォルト名およびタイプを出力ペイロードにコピーするコピー・ルールが自動的に挿入されます。throwアクティビティによってスローされるフォルトはBPEL内部のフォルトです。throwアクティビティは、クライアントと通信する非同期プロセスには使用できません。throwアクティビティには、namefaultNameおよびfaultVariableの3つの要素があります。BPELプロセスは、内部フォルトのスローとは対照的に、別のアプリケーションにフォルトを送信して問題を提示できます。同期操作では、replyアクティビティによってフォルトを戻すことができます。非同期操作では、invokeアクティビティがこの機能を実行します。

throwアクティビティでフォルトを処理する手順は、次のとおりです。

  1. エラーまたは例外メッセージを生成するBPELプロセスで、「Throw」アクティビティをドラッグ・アンド・ドロップします。

  2. 「Throw_1」アイコンをダブルクリックします。

  3. 図7-26に示すように、「Throw」ダイアログを使用して値を入力します。

    図7-26 「Throw」ダイアログ

    図7-26の説明は次にあります。
    「図7-26 「Throw」ダイアログ」の説明

  4. 「OK」をクリックします。

  5. ファイルを保存します。

7.10.2 フォルト処理時の処理内容

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>