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

前へ
前へ
 
次へ
次へ
 

7.3 Webサービスの起動

Webサービスは、同期または非同期の操作として起動できます。同期Webサービスは、問合せに対して即時レスポンスを提供し、操作中はBPELプロセスを遮断します。非同期Webサービスは、BPELプロセスを遮断しないため、サービスでのクライアント・リクエストの処理に時間を要する可能性がある環境に便利です。また、非同期サービスは、同期サービスより耐障害性に優れた拡張性のあるアーキテクチャを提供します。

同期および非同期のWebサービスには、次の要素が必要です。

非同期Webサービスには、次の要素も必要です。

SOA Order BookingアプリケーションのBPELプロセスには、(Rapid Manufacturerへの)同期Webサービスの起動と(Select Manufacturerへの)非同期Webサービスの起動が含まれています。

図7-5は、同期起動を示しています。invokeアクティビティ(InvokeRapidManufacturer)は、「RapidService」パートナ・リンクを使用して見積りを依頼します。Rapid Manufacturer Webサービス(図には表示されていません)は、問合せに対して即時にリプライします。

図7-5 Rapid Manufacturerへの同期起動

図7-5の説明は次にあります。
「図7-5 Rapid Manufacturerへの同期起動」の説明

図7-6は、非同期起動を示しています。invokeアクティビティ(InvokeSelectManufacturer)は、「SelectService」パートナ・リンクを使用して見積りを依頼します。Select Manufacturer Webサービス(図には表示されていません)がリクエストを処理し、「ReceiveSelectManufacturer」アクティビティに対してリプライを戻します。このアクティビティは相関IDで追跡されます。

図7-6 Select Manufacturerへの非同期起動

図7-6の説明は次にあります。
「図7-6 Select Manufacturerへの非同期起動」の説明

7.3.1 Webサービスの起動方法

同期および非同期によるWebサービスの起動では、次のアクティビティをBPELプロセスに追加します。

  • BPELプロセスが相互作用する外部Webサービスを定義するためのpartner linkアクティビティ。

  • 独自のローカル変数やフォルト・ハンドラが含まれる関連アクティビティをネストするためのscopeアクティビティ。

  • Webサービス(パートナ・リンクによって識別される)を起動する操作を指定するためのinvokeアクティビティ。

  • 2つのassignアクティビティ。最初のassignアクティビティは、クライアントの問合せ入力を取得し、Webサービスと連絡を取ります。2番目のassignアクティビティは、Webサービスからのレスポンスを戻します。

非同期Webサービスの起動には、次のアクティビティも追加します。

  • invokeアクティビティの後のreceiveアクティビティ(図7-6を参照)。receiveアクティビティは、Webサービスからのデータを受信します。「Receive」ダイアログを使用して、WebサービスWSDLによって提供されるパートナ・リンク、操作および変数を選択します。

7.3.1.1 パートナ・リンクの作成

パートナ・リンクは、BPELプロセスが相互作用する外部サービスを定義します。

Webサービスに対するパートナ・リンクを作成する手順は、次のとおりです。

  1. 非同期BPELプロセスを作成します。

    作成手順は、第7.2.1項「アプリケーションの作成方法」を参照してください。

  2. 「PartnerLink」アクティビティを「サービス」スイムレーンのいずれかにドラッグ・アンド・ドロップします。

  3. 図7-7に示すように、「パートナ・リンクの作成」ダイアログの「一般」タブを使用して、パートナ・リンクを作成するための値を入力します。

    図7-7 非同期Webサービスに対するパートナ・リンクの作成

    図7-7の説明は次にあります。
    「図7-7 非同期Webサービスに対するパートナ・リンクの作成」の説明

    1. パートナ・リンクの名前を入力します。

    2. 「サービス・エクスプローラ」(懐中電灯アイコン)を使用して、WebサービスWSDLファイルのURLを参照します。

      このWSDLにはWebサービスの通信エンドポイントが記述されています。

    3. パートナ・リンク・タイプを選択します。

      この値はWebサービスWSDLによって提供されます。

    4. パートナ・ロールを選択します。

      これはWebサービスのプロバイダ・ロールです。 この値はWebサービスWSDLによって提供されます。

    5. 同期Webサービスの起動では、「マイ・ロール」フィールドをスキップします。同期Webサービスに対するパートナ・リンクには、ロールは不要です。

      図7-7に示すように、非同期Webサービスの起動では、「パートナ・リンクの作成」ダイアログの「マイ・ロール」フィールドに値を選択します。これはBPELプロセスのリクエスト側のロールです。この値は、WebサービスWSDLによって提供され、BPELプロセスにレスポンスを戻すためにSelect Manufacturer Webサービス(CallSelectManufacturer)が必要とする値です。

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

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

7.3.1.2 scopeアクティビティの作成

scopeアクティビティは、1単位として処理するアクティビティのグループのコンテナです。

scopeアクティビティを作成する手順は、次のとおりです。

  1. 「receiveInput」アクティビティと「callbackClient」アクティビティ間に、「Scope」アクティビティをドラッグ・アンド・ドロップします。

  2. 「Scope」アクティビティをダブルクリックします。

  3. 「一般」タブを選択し、「Scope」アクティビティの名前を入力します。

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

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

7.3.1.3 scopeアクティビティへのinvokeアクティビティの作成

invokeアクティビティは、パートナ・リンクによって識別されたWebサービスに情報(通常はリクエスト)を送信し、そのWebサービスで実行する操作を指定します。

scopeアクティビティ内部にinvokeアクティビティを作成する手順は、次のとおりです。

  1. 作成した「Scope」アクティビティを開きます。

  2. 「Invoke」アクティビティを「Scope」アクティビティにドラッグ・アンド・ドロップします。

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

  4. 「Invoke」ダイアログを使用して、BPELプロセスとWebサービス間の最初の相互作用の操作を識別します。

    1. 「Invoke」アクティビティの名前を入力します。

    2. 以前に作成したパートナ・リンクを参照します。

    3. 操作を選択します。

      この値はWebサービスWSDLによって提供されます。

    4. 「入力変数」フィールドの右側にある最初のアイコン(「変数自動作成」アイコン)を使用して入力変数を作成します。

      invokeName_operationName_InputVariableという名前の変数が「入力変数」フィールドに自動的に作成されます。この変数には、メッセージ・タイプのWebServiceNameRequestMessageが自動的に割り当てられます。 この値はWebサービスWSDLによって提供されます。この変数にはリクエストの内容が保持され、Webサービスに送信されます。

    5. 「出力変数」フィールドの右側にある最初のアイコンを使用して、出力変数を作成します。

      invokeName_operationName_OutputVariableという名前の変数が「出力変数」フィールドに自動的に作成されます。この変数には、メッセージ・タイプのWebServiceNameResponseMessageが自動的に割り当てられます。 この値はWebサービスWSDLによって提供されます。この変数にはWebサービスからのリプライの内容が保持されます。

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

7.3.1.4 scopeアクティビティへの1つ目のassignアクティビティの作成

assignアクティビティは、変数、式およびその他の要素間のデータを転送します。

scopeアクティビティ内部に1つ目のassignアクティビティを作成する手順は、次のとおりです。

  1. 「Assign」アクティビティを「Scope」アクティビティ内の「Invoke」アクティビティの上にドラッグ・アンド・ドロップします。

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

  3. 「Assign」ダイアログの「一般」タブを使用して、「Assign」アクティビティの名前を入力します。

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

  5. 「コピー操作」タブをクリックします。

  6. 「作成」リストから「コピー操作」を選択します。

  7. 図7-8に示すように、「コピー操作の作成」ダイアログを使用して、特定の変数の内容を別の変数にコピーします。この「Assign」アクティビティは、クライアントの発注を入力として取得し、価格の見積りについてRapid Manufacturer Webサービスに連絡します。

    図7-8 「コピー操作」ダイアログ

    図7-8の説明は次にあります。
    「図7-8 「コピー操作」ダイアログ」の説明

    1. 「From」側の「変数」で、クライアントの入力変数名(BPELプロセスWSDLファイルに定義されている)が見つかるまでツリーを開きます。

    2. 「To」側の「変数」で、Webサービスが使用する入力変数名(WebサービスWSDLのメッセージ・タイプ定義に定義されている)が見つかるまでツリーを開きます。

  8. 「コピー操作の作成」ウィンドウと「Assign」ウィンドウを閉じます。

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

7.3.1.5 scopeアクティビティへの2つ目のassignアクティビティの作成

この2つ目のassignアクティビティは、クライアントの発注に対するレスポンスで価格の見積りを戻します。

scopeアクティビティ内部に2つ目のassignアクティビティを作成する手順は、次のとおりです。

  1. 2つ目の「Assign」アクティビティを「Scope」アクティビティ内の「Invoke」アクティビティの下にドラッグ・アンド・ドロップします。

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

  3. 「Assign」ダイアログの「一般」タブを使用して、アクティビティの名前を入力します。

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

  5. 「コピー操作」タブをクリックします。

  6. 「作成」リストから「コピー操作」を選択します。

  7. 「コピー操作の作成」ダイアログを使用して、特定の変数の内容を別の変数にコピーします。

    1. 「From」側の「変数」で、クライアントの出力変数名(BPELプロセスWSDLファイルに定義されている)が見つかるまでツリーを開きます。

    2. 「To」側の「変数」で、Webサービスが使用する出力変数名(WebサービスWSDLのメッセージ・タイプ定義に定義されている)が見つかるまでツリーを開きます。

  8. 「コピー操作の作成」ウィンドウと「Assign」ウィンドウを閉じます。

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

7.3.1.6 receiveアクティビティの作成

receiveアクティビティは、クライアントからのメッセージまたは非同期Webサービスからのコールバック・レスポンス・メッセージを待機します。

receiveアクティビティを作成する手順は、次のとおりです。

  1. 「Receive」アクティビティを「Invoke」アクティビティの下にドラッグ・アンド・ドロップします。

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

  3. 図7-9に示すように、「一般」タブを使用してreceiveアクティビティの値を入力します。

    図7-9 「Receive」ダイアログ

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

    1. 「Receive」アクティビティの名前を入力します。

    2. 懐中電灯アイコンを使用して、Webサービスのパートナ・リンクを参照します。

      この値はWebサービスWSDLによって提供されます。

    3. 操作を選択します。

      この値はWebサービスWSDLによって提供されます。

    4. 懐中電灯アイコンを使用して、Webサービスからのレスポンスを保持する変数を参照します。

      この値はWebサービスWSDLによって提供されます。

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

7.3.2 Webサービス起動時の処理内容

同期Webサービスの起動では、次のことが実行されます。

  1. 「receiveInput」 receiveアクティビティは、WSDLファイル(bpel_process_name.wsdl)の定義に従って、ユーザー(クライアント)からの入力を受信します。

  2. 1つ目のassignアクティビティは、Webサービスが受け取れるようにクライアントからのデータをパッケージ化します。

  3. パートナ・リンクは、パッケージ化されたデータをWebサービスに送信し、レスポンスを受信します。

  4. 2つ目のassignアクティビティは、クライアント・アプリケーションが受け取れるように、レスポンスを「replyOutput」アクティビティに再パッケージ化します。

  5. 「replyOutput」アクティビティは、再パッケージ化されたレスポンスをクライアントに送信します。

例7-2に、同期Webサービスのパートナ・リンク定義とinvoke要素を示します。

例7-2 同期Webサービスのパートナ・リンク定義とinvoke要素のソース・コード

<!-- This section shows where the partner link is defined.-->
  <partnerLink name="RapidService" partnerRole="RapidQuote_Role"
               partnerLinkType="ns23:RapidQuote_PL"/>
...
  <scope name="CallRapidManufacturer">
    <variables>
      <variable name="manufacturerRequest"
                messageType="ns23:RequestQuotePortType_POItemsQuote"/>
    </variables>
    <sequence name="Sequence_6">
      <assign name="TransformRapidRequest">
        <bpelx:annotation>
          <bpelx:pattern>transformation</bpelx:pattern>
        </bpelx:annotation>
        <copy>
          <from expression="ora:processXSLT('RapidTransformation.xsl',
            bpws:getVariableData('inputVariable','payload'))"/>
          <to variable="manufacturerRequest" part="parameters"/>
        </copy>
      </assign>
      <invoke name="InvokeRapidManufacturer"
              partnerLink="RapidService" portType="ns23:RequestQuote"
              operation="POItemsQuote"
              inputVariable="manufacturerRequest"
              outputVariable="rapidManufacturerResponse"/>
    </sequence>
  </scope>

非同期Webサービスの起動では、次のことが実行されます。

  1. assignアクティビティが発注を準備します。

  2. invokeアクティビティ(InvokeSelectManufacturer)がリクエストを開始します。このリクエストの内容はリクエスト変数に入ります。リクエスト変数は非同期Webサービスに送信されます。

    リクエストが開始されると、相関ID(リクエストを開始したクライアントとパートナ・リンクに一意)もWebサービスに送信されます。相関IDを使用することで、対応するリクエスタに正しいレスポンスが戻るようになります。

  3. Webサービスは、相関IDによる追跡に従って、レスポンスをreceiveアクティビティ(ReceiveSelectManufacturer)に送信します。

  4. assignアクティビティ(AssignSelectManufacturer)がレスポンスを読み込みます。

例7-3に、非同期Webサービスのパートナ・リンク定義とinvokeおよびreceive要素のソース・コードを示します。

例7-3 非同期Webサービスのパートナ・リンク定義とinvokeおよびreceive要素のソース・コード

<!-- This section shows where the partner link is defined.-->
  <partnerLink myRole="SelectServiceRequester" name="SelectService"
               partnerRole="SelectServiceProvider"
               partnerLinkType="ns17:SelectService_PL"/>
...
  <scope name="GetSelectMfrQuote">
    <variables>
      <variable name="manufacturerRequest"
                messageType="ns17:RequestQuote_processRequestQuote"/>
    </variables>
    <sequence name="Sequence_15">
      <assign name="TransformSelectRequest">
        <bpelx:annotation>
          <bpelx:pattern>transformation</bpelx:pattern>
        </bpelx:annotation>
        <copy>
          <from expression="ora:processXSLT('SelectTransformation.xsl',bpws:getVariableData
            ('inputVariable','payload'))"/>
          <to variable="manufacturerRequest" part="parameters"/>
        </copy>
      </assign>
      <invoke name="InvokeSelectManufacturer"
              partnerLink="SelectService"
              portType="ns17:SelectService"
              operation="processRequestQuote"
              inputVariable="manufacturerRequest"/>
      <receive name="ReceiveSelectManufacturer" createInstance="no"
               partnerLink="SelectService"
               portType="ns17:SelectServiceCallback"
               operation="processRequestQuoteResponse"
               variable="selectManufacturerResponse"/>
    </sequence>
  </scope>