ヘッダーをスキップ
Oracle® Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.6.2)
B56238-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

8 BPELプロセスからの非同期Webサービスの起動

この章では、BPELプロセスから非同期Webサービスを起動する方法について説明します。ここでは、非同期起動の実行に必要なコンポーネントを設定する方法、およびこれらのコンポーネントをコーディングする方法についても示します。また、動的パートナ・リンクの作成方法およびWS-Addressingの使用方法についても説明します。

この章には次の項が含まれます:

8.1 非同期Webサービスの起動に関する概要

非同期メッセージ形式は、サービス(融資処理など)でクライアント・リクエストの処理に時間がかかる環境で役に立ちます。また、非同期サービスは、同期サービスよりも優れた耐障害性を持ち、かつスケーラブルなアーキテクチャも提供します。

この項では、United Loanという企業での非同期Webサービスの起動について説明します。United Loanは、クライアントの融資申請リクエストを処理して融資提案を返す非同期Webサービスを公開します。このユースケースでは、BPELプロセス・サービス・コンポーネントとこの非同期融資申請承認Webサービスを統合する方法について説明します。

このユースケースでは、非同期サービスからの情報をリクエストし、レスポンスを受け取るための基本的な設計概念について説明します。この例のUnited Loanの非同期サービスは、別のBPELプロセス・サービス・コンポーネントです。しかし、適切に設計されたWebサービスであれば、同じBPELコールで対話できます。ターゲットのWebサービスのWSDLファイルには、必要な情報のリクエストと受信に必要な情報が含まれています。

非同期Webサービスでは、次のアクションが(優先度に従って)実行されます。

  1. assignアクティビティにより融資申請が準備されます。

  2. invokeアクティビティにより融資申請が開始されます。申請の内容は、リクエスト変数に入力されます。このリクエスト変数が非同期融資処理Webサービスに送信されます。

    融資申請の開始時、申請を開始したクライアントとパートナ・リンクに固有の相関IDも、融資処理Webサービスに送信されます。相関IDにより、適切な融資提案レスポンスが、対応する融資申請のリクエスト元に確実に返されます。

  3. その後、融資処理Webサービスにより、適切なレスポンスがreceiveアクティビティ(相関IDを使用して追跡)に送信されます。

  4. assignアクティビティにより融資申請提案が読み取られます。

後続の各項では、非同期機能の詳細を説明します。

8.2 非同期Webサービスの起動

この項では、非同期機能をBPELプロセス・サービス・コンポーネントに追加するためのタスクの概要を説明します。

8.2.1 非同期Webサービスの起動方法

次の手順を実行し、Webサービスを非同期で起動します。

  • パートナ・リンクの追加

  • invokeアクティビティの追加

  • receiveアクティビティの追加

  • assignアクティビティの作成

8.2.1.1 非同期サービスに対するパートナ・リンクの追加

ここでは、融資申請承認Webサービスに対するパートナ・リンク(この例ではLoanServiceという名前)をBPELプロセスに作成する方法について説明します。

非同期サービスに対してパートナ・リンクを追加する手順は、次のとおりです。

  1. SOAコンポジット・エディタで、BPELプロセスを「コンポーネント・パレット」の「サービス・コンポーネント」セクションからデザイナにドラッグします。

    「BPELプロセスの作成」ダイアログが表示されます。

  2. ダイアログの説明に従って、BPELプロセス・サービス・コンポーネントを作成します。

  3. 完了後に「OK」をクリックします。

  4. SOAコンポジット・エディタのSOAコンポジット・アプリケーションで、BPELプロセス・サービス・コンポーネント(この例では、LoanBrokerというコンポーネント名)をダブルクリックします。

    Oracle BPELデザイナが表示されます。

  5. 「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  6. 「パートナ・リンク」アイコンを適切な「パートナ・リンク」スイムレーンにドラッグします。

    「パートナ・リンクの作成」ダイアログが表示されます。

  7. 次の詳細を入力して、パートナ・リンクを作成し、融資申請承認Webサービスを選択します。

    • 名前

      パートナ・リンクの名前を入力します(この例ではLoanServiceを入力します)。

    • プロセス

      BPELプロセス・サービス・コンポーネント名が表示されます(この例ではLoanBrokerが表示されます)。

    • WSDL URL

      使用するWeb Services Description Language(WSDL)ファイルを入力します。このフィールドの上にある「SOAリソース・ルックアップ」アイコンをクリックして、正しいWSDLを検索します。

    • パートナ・リンク・タイプ

      BPELプロセス・サービス・コンポーネントのインタフェース先である外部サービスを指します。リストから選択します(この例ではLoanServiceを選択します)。

    • パートナ・ロール

      外部ソースのロールです(プロバイダなど)。リストから選択します(この例ではLoanServiceProviderを選択します)。

    • マイ・ロール

      この相互作用におけるBPELプロセス・サービス・コンポーネントのロールです。リストから選択します(この例ではLoanServiceRequesterを選択します)。

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

    融資申請承認Webサービス(United Loan)の新しいパートナ・リンクがデザイナのスイムレーンに表示されます。

8.2.1.2 invokeアクティビティの追加

次の手順に従って、invokeアクティビティとrequestという名前のグローバル入力変数を作成します。このアクティビティは、融資申請承認Webサービス(United Loan)を使用して、非同期BPELプロセス・サービス・コンポーネント・アクティビティを開始します。融資申請承認Webサービスは、request入力変数を使用してクライアントからの融資申請を受け取ります。

invokeアクティビティを追加する手順は、次のとおりです。

  1. 「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  2. invokeアクティビティをreceiveアクティビティの下にドラッグします。

  3. 「構造」ウィンドウに移動します。この例では、「構造」ウィンドウから変数を作成する手順を説明しますが、「Invoke」ダイアログの「入力」フィールドと「出力」フィールドの右側にある「追加」アイコンをクリックして変数を作成することもできます。

  4. 「変数」を右クリックし、「すべての子ノードを開く」を選択します。

  5. ツリーの2つ目の「変数」フォルダで右クリックし、「変数の作成」を選択します。

    「変数の作成」ダイアログが表示されます。

  6. 変数名を入力し、表示されたオプションから「メッセージ・タイプ」を選択します。

    • タイプ

      このオプションでは、XMLスキーマの単純型(文字型やブール型など)を選択できます。

    • メッセージ・タイプ

      このオプションでは、パートナ・リンクまたは現在のBPELプロセス・サービス・コンポーネントのプロジェクトWSDLファイルに対するWSDLメッセージ・ファイル定義を選択できます(レスポンス・メッセージやリクエスト・メッセージなど)。メッセージ・タイプと関連付けられている変数をinvoke、receiveまたはreplyアクティビティの入力変数または出力変数として指定できます。

      メッセージ・タイプを表示するには、「メッセージ・タイプ」オプションを選択し、「参照」アイコンを選択して「タイプ・チューザ」ダイアログを表示します。ここから選択するために「メッセージ・タイプ」ツリーを開きます。この例では、「メッセージ・タイプ」「パートナ・リンク」「Loan Service」「LoanService.wsdl」「メッセージ・タイプ」「LoanServiceRequestMessage」を順に選択します。

    • 要素

      このオプションでは、現在のBPELプロセス・サービス・コンポーネントのプロジェクト・スキーマ・ファイルまたはプロジェクトWSDLファイルのXMLスキーマ要素、またはパートナ・リンクのXMLスキーマ要素を選択できます。

    図8-1に、「変数の作成」ダイアログを示します。

    図8-1 「変数の作成」ダイアログ

    図8-1の説明が続きます
    「図8-1 「変数の作成」ダイアログ」の説明

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

  8. invokeアクティビティをダブルクリックし、「Invoke」ダイアログを表示します。

  9. 「Invoke」ダイアログで、「パートナ・リンク」リストからパートナ・リンク(この例では「LoanService」)を選択し、「操作」リストから「initiate」を選択します。

  10. 「入力」フィールドの右で、2番目のアイコンをクリックし、ステップ6で作成した入力変数を選択します。

    「変数チューザ」ダイアログが表示され、変数の選択が可能になります。

    出力変数はreceive操作で返されるため、指定していません。invokeアクティビティが作成されました。

    invokeアクティビティの詳細は、第8.2.2.5項「invokeアクティビティとreceiveアクティビティ」を参照してください。

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

8.2.1.3 receiveアクティビティの追加

次の手順に従って、receiveアクティビティとresponseという名前のグローバル出力変数を作成します。このアクティビティは、融資申請承認Webサービスのコールバック処理を待機します。融資申請承認Webサービスは、この出力変数を使用して、融資提案結果をクライアントに送信します。

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

  1. 「コンポーネント・パレット」から、receiveアクティビティを、第8.2.1.2項「invokeアクティビティの追加」で作成したinvokeアクティビティの直後にドラッグします。

  2. 第8.2.1.2項「invokeアクティビティの追加」のステップ3からステップ7と同様の手順で、「変数の作成」ダイアログを開き、受信情報を格納する変数を作成します。

    図8-2に、BPEL 1.1の「変数の作成」ダイアログを示します。

    図8-2 「変数の作成」ダイアログ

    図8-2の説明が続きます
    「図8-2 「変数の作成」ダイアログ」の説明


    注意:

    BPEL仕様のバージョン2.0をサポートするBPELプロジェクトでは、「変数の作成」ダイアログに、変数タイプのインラインを(変数、式、リテラル、パートナ・リンク、プロパティなどとして)初期化できる「初期化」タブがあります。詳細は、第6.5.2項「BPEL 2.0のインラインfrom-specを使用した変数の初期化」を参照してください。


  3. receiveアクティビティをダブルクリックし、名前をreceive_invokeに変更します。

  4. 「パートナ・リンク」リストからパートナ・リンクを選択します(この例では「LoanService」を選択します)。

  5. 「操作」リストから「onResult」を選択します。「インスタンスの作成」チェック・ボックスは選択しないでください。

  6. 第8.2.1.2項「invokeアクティビティの追加」のステップ3からステップ7で作成した変数を選択します。

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

    receiveアクティビティと出力変数が作成されます。BPELファイル(この例ではLoanBroker.bpel)の最初のreceiveアクティビティが最初のBPELプロセス・インスタンス・サービス・コンポーネント・インスタンスを作成したため、2つ目のインスタンスを作成する必要はありません。

8.2.1.4 その他のアクティビティの実行

非同期固有のタスクに加え、次のタスクを実行する必要があります。

  • クライアントの融資申込書のinput変数ペイロードを融資申請承認Webサービスのrequest変数ペイロードにコピーする、データ操作用の最初のassignアクティビティを、invokeアクティビティの前に作成します。

  • 受け取るクライアントのoutput変数に融資申請承認Webサービスの融資申請結果のresponse変数ペイロードをコピーする、データ操作用の2番目のassignアクティビティを、receiveアクティビティの後ろに作成します。

8.2.2 非同期Webサービス起動時の処理内容

この項では、非同期Webサービス起動時の処理内容について説明します。

8.2.2.1 WSDLファイルのportTypeセクション

WSDLファイル(この例ではLoanService)のportTypeセクションは、非同期サービスに使用するポートを定義します。

非同期サービスにはポート・タイプが2つ定義されます。各ポート・タイプは一方向操作を実行します。この例では、1つのポート・タイプが非同期プロセスに応答し、もう1つのポート・タイプが非同期レスポンスを使用してクライアントをコールバックします。例8-1では、portType LoanServiceCallbackがクライアントの融資申請リクエストを受け取り、portType LoanServiceが融資提案レスポンスを使用してクライアントを非同期でコールバックします。

例8-1 portType定義

<!-- portType implemented by the LoanService BPEL process -->
   <portType name="LoanService">
      <operation name="initiate">
         <input message="tns:LoanServiceRequestMessage"/>
      </operation>
   </portType>
<!-- portType implemented by the requester of LoanService BPEL process
for asynchronous callback purposes
-->
   <portType name="LoanServiceCallback">
      <operation name="onResult">
         <input message="tns:LoanServiceResultMessage"/>
      </operation>
   </portType>

8.2.2.2 WSDLファイルのpartnerLinkTypeセクション

WSDLファイル(この例ではLoanService)のpartnerLinkTypeセクションは、BPELプロセス・サービス・コンポーネントの次の特性を定義します。

  • 果たすロール(操作)

  • 対話でメッセージを受信するために提供するportType

非同期サービスのパートナ・リンク・タイプには、Webサービス・プロバイダに対するロールとクライアント・リクエスタに対するロールの2つのロールがあります。

例8-2では、LoanServiceProviderロールおよびLoanService portTypeは、クライアント・リクエスト・メッセージに使用され、LoanServiceRequesterロールおよびLoanServiceCallback portTypeは、レスポンス・メッセージをクライアントに非同期で返す(コールバックする)ために使用されます。

例8-2 partnerLinkType定義

<plnk:partnerLinkType name="LoanService">
        <plnk:role name="LoanServiceProvider">
            <plnk:portType name="client:LoanService"/>
        </plnk:role>
        <plnk:role name="LoanServiceRequester">
            <plnk:portType name="client:LoanServiceCallback"/>
        </plnk:role>
    </plnk:partnerLinkType>

2つのポート・タイプ(invokeアクティビティのportType="services:LoanService"receiveアクティビティのportType="services:LoanServiceCallback")は、この1つの非同期BPELプロセス・サービス・コンポーネントに結合されます。基本的に、ポート・タイプは実行される一連の操作です。このBPELプロセス・サービス・コンポーネントの場合、実行する操作は2つ(invokeアクティビティのinitiatereceiveアクティビティのonResult)あります。

8.2.2.3 BPELファイルのパートナ・リンク・セクション

サービスをBPELからコールするには、プロセスとWebサービスの連携方法をBPELファイルで定義する必要があります。partnerLinksセクションを表示します。プロセスが相互作用するサービスはパートナ・リンクとして設計されます。各パートナ・リンクは、partnerLinkTypeによって定義されます。

各パートナ・リンクには名前が付けられています。この名前は、そのパートナ・リンクによるすべてのサービス相互作用に使用されます。これは、レスポンスを、同じタイプの同時リクエストに対する異なるパートナ・リンクに相関する場合に重要です。

非同期プロセスは、クライアントへのコールバックに2番目のパートナ・リンクを使用します。この例では、2番目のパートナ・リンクLoanServiceが融資申請承認Webサービスによって使用されます。例8-3に例を示します。

例8-3 partnerLink定義

  <!-- This process invokes the asynchronous LoanService. -->

    <partnerLink name="LoanService"
             partnerLinkType="services:LoanService"
             myRole="LoanServiceRequester"
             partnerRole="LoanServiceProvider"/>
  </partnerLinks>

属性myRoleは、クライアントのロールを示します。属性partnerRoleは、この対話におけるパートナのロールを示します。非同期プロセスでは、各partnerLinkTypemyRole属性とpartnerRole属性があります。

8.2.2.4 コンポジット・アプリケーション・ファイル

composite.xmlファイルには、例8-4に示すように、融資申請承認Webサービスが表示されます。

例8-4 融資申請承認Webサービス

<component name="LoanBroker">
    <implementation.bpel process="LoanBroker.bpel"/>
</component>

パートナ・リンクの作成手順の詳細は、第8.2.1.1項「非同期サービスに対するパートナ・リンクの追加」を参照してください。

8.2.2.5 invokeアクティビティとreceiveアクティビティ

variablesおよびsequenceセクションを表示します。ここでは特に、invokeアクティビティとreceiveアクティビティの2つの領域に注目します。

  • invokeアクティビティは、同期Webサービスを起動(第7章「BPELプロセスからの同期Webサービスの起動」を参照)するか、または非同期サービスを開始します。

    invokeアクティビティにはvariableセクションで定義されたrequestグローバル入力変数が含まれます。requestグローバル入力変数は融資申請承認Webサービスで使用されます。この変数には、最初の融資申込書の内容が格納されます。

  • 融資申請承認Webサービスからの非同期コールバックを待機するreceiveアクティビティ。receiveアクティビティにはvariablesセクションで定義されたresponseグローバル出力変数が含まれます。この変数には、融資提案レスポンスが格納されます。receiveアクティビティは、サービスからのコールバック・メッセージを非同期に待機します。BPELプロセス・サービス・コンポーネントは、コールバック・メッセージの到着を待機中、デハイドレーション(圧縮して格納)されます。

例8-5に例を示します。

例8-5 invokeアクティビティとreceiveアクティビティ

  <variables>

    <variable name="request"
               messageType="services:LoanServiceRequestMessage"/>
    <variable name="response"
               messageType="services:LoanServiceResultMessage"/>
  </variables>

<sequence>


    <!-- initialize the input of LoanService -->
    <assign>
    <!--  initiate the remote process -->
    <invoke name="invoke" partnerLink="LoanService"
        portType="services:LoanService"
        operation="initiate" inputVariable="request"/>

    <!--  receive the result of the remote process -->
    <receive name="receive_invoke" partnerLink="LoanService"
        portType="services:LoanServiceCallback"
        operation="onResult" variable="response"/>

invokeアクティビティによって非同期サービスが開始されると、Web Services Addressing(WS-Addressing)(第8.4項「非同期サービスでのWS-Addressingの使用」で説明)を使用して、クライアント・リクエストに固有の相関IDが送信されます。複数のプロセスがサービス・コールバックを待機している可能性があるため、サーバーでは、どのBPELプロセス・サービス・コンポーネント・インスタンスが融資申請承認Webサービスからのコールバック・メッセージを待機しているかを把握する必要があります。相関IDによって、サーバーは、レスポンスを適切なリクエスト・インスタンスと関係付けることができます。

8.2.2.6 新しいインスタンスを開始するためのcreateInstance属性

最初のreceiveアクティビティには、createInstance属性があります。この最初のreceiveアクティビティでは、createInstance要素はyesに設定されています。これにより、新しいBPELプロセス・サービス・コンポーネント・インスタンスが起動されます。対話のためには、少なくとも1つのインスタンスが起動している必要があります。このため、2番目のreceiveアクティビティではcreateInstance変数をnoに設定します。

例8-6に、createInstance属性のソース・コードを示します。

例8-6 createInstance属性

    <!-- receive input from requester -->
    <receive name="receiveInput" partnerLink="client"
             portType="tns:LoanBroker"
             operation="initiate" variable="input"
             createInstance="yes"/>

8.2.2.7 長期間にわたる非同期プロセスを保持するためのデハイドレーション・ポイント

非同期コールバックの待機中、長期間にわたる非同期プロセスとその現在の状態の情報をデータベース内に自動的に保存するには、データベースをデハイドレーション・ストアとして使用します。データベースにプロセスを格納することにより、プロセスを維持し、システムの停止やネットワークの問題が発生した場合の状態や信頼性の低下を防ぎます。この機能により、BPELプロセス・サービス・コンポーネントの信頼性とスケーラビリティの両方が向上します。また、クラスタリングおよびフェイルオーバーのサポートにもこの機能を使用できます。

invokeアクティビティとreceiveアクティビティの間にこのポイントを挿入します。dehydrateアクティビティを使用してデハイドレーション・ポイントを明示的に指定することもできます。詳細は、A.2.9項「dehydrateアクティビティ」を参照してください。

8.2.2.8 複数のランタイム・エンドポイント・ロケーション

Oracle SOA Suiteでは、パートナ・リンクの複数のエンドポイント・ロケーションの指定がサポートされています。この機能は、最初のエンドポイントが停止した場合に、フェイルオーバーするのに便利です。パートナ・リンクの代替エンドポイント・ロケーションを提供するには、composite.xmlファイルにlocation属性を追加します。例8-7に例を示します。

例8-7 代替のランタイム・エンドポイント・ロケーション

<reference name="HeaderService ...>
<binding.ws port="http://services.otn.com/HelloWorldApp#wsdl.endpoint(client/
  HelloWorldService_pt)"
location="http://server:port/soa-infra/services/default/ 
 HelloWorldService!1.0/client?WSDL">
<property name="endpointURI">http://jsmith.us.oracle.com:80/a.jsp 
@http://myhost.us.oracle.com:8888/soa-infra/services/HelloWorldApp/HelloWorld!
1.0*2007-10-22_14-33-04_195/client
 </property>
</binding.ws>
</reference>

8.2.3 複数のクライアント・コンポーネントによる1つのコンポジットの起動に関する注意事項

複数のクライアント・コンポーネントがそのリモートのWSDLファイルを使用して1つのSOAコンポジット・アプリケーションを起動した場合は、リモート・コンポジットをコールしている元のクライアントにreceiveアクティビティが存在する場合にのみ、コールバック・レスポンスをこのクライアントで取得できます。元のクライアントにreceiveアクティビティが存在せず、コンポジットをコールする後続のクライアントのいずれにもreceiveアクティビティが存在しない場合、レスポンス・メッセージは失われます。これにより、元のクライアント・プロセスのリカバリ状態となります。

これは予想された動作です。これは、起動されているコンポジットでは、receiveアクティビティがどのクライアントに存在するか、またはクライアントが実際にBPELプロセス・サービス・コンポーネントであるかどうかを認識できないためです。

8.2.4 BPEL 2.0 IMAサポートの制限に関する注意事項

receiveアクティビティは一種のインバウンド・メッセージ・アクティビティ(IMA)です。IMAのその他の例は次のとおりです。

  • scopeアクティビティ(BPEL 1.1)またはpickアクティビティのonMessageブランチ

  • BPEL 2.0のscopeアクティビティのonEventブランチ

BPEL 2.0仕様では、複数のIMAを相互に使用する、または拡張アクティビティから導出した他のIMAとともに使用することができます。実行時の動作を一定に保つために、BPEL 2.0仕様ではinitiate属性をjoinに設定した相関セットを使用できます。ただし、Oracle BPEL Process ManagerにおけるBPEL 2.0仕様では、この動作がサポートされていません。複数のIMAをサポートする唯一の方法は、それらをpickアクティビティのonMessageブランチとしてコーディングする(つまり、createInstanceyesに設定する)ことです。また、Oracle BPEL Process Managerでは、複数IMAのその他の形、たとえば2つのブランチを持つflowアクティビティで、それぞれがreceiveアクティビティを持ち、createInstanceの設定がyesで、相関セットのinitiateの設定がjoinであるなどの形もサポートされていません。

解決方法として、次のように、交互に2つのreceiveアクティビティがある2つのBPELプロセスを設計する必要があります。

  • Process1: receive1の後にreceive2が続きます。receive1でのみ、createInstanceyesに設定されています。

  • Process2: receive2の後にreceive1が続きます。receive2でのみ、createInstanceyesに設定されています。

同じことが、receiveアクティビティとpickアクティビティ、または2つのpickアクティビティなど、IMAの他の組合せにも適用されます。

8.2.5 対話ID指定時の処理内容

invokeアクティビティ(およびreceiveアクティビティなどの他のアクティビティ、pickまたはscopeアクティビティのonMessageブランチ)の「対話ID」フィールドにオプションの対話ID値を入力することもできます。

対話IDは、非同期対話中にプロセス・インスタンスを識別します。デフォルトでは、BPELプロセス・サービス・エンジンにより、WSAアドレッシングで指定されているように、対話(複数のinvokeアクティビティおよびreceiveアクティビティにまたがる可能性があります)ごとに一意のIDが生成されます。必要に応じて、使用するサービス・エンジンに独自の値を指定できます。対話IDはbpelx:conversationId拡張要素で実装されます。

8.2.5.1 BPEL 1.1のbpelx:conversationId

例8-8に、BPELバージョン1.1をサポートするBPELプロジェクト内のbpelx:conversationId拡張要素の例を示します。bpelx:conversationId拡張要素はXPath式をとります。

例8-8 BPEL 1.1のbpelx:conversationId対話ID

<invoke ... bpelx:conversationId="$convId2">
</invoke>

<receive ... bpelx:conversationId="$convId2">
</receive>

<onMessage... bpelx:conversationId="$convId2">
</onMessage>

8.2.5.2 BPEL 2.0のbpelx:conversationId

例8-9に、BPELバージョン2.0をサポートするBPELプロジェクト内のbpelx:conversationId拡張要素の例を示します。bpelx:conversationId拡張要素はBPEL 2.0 XPath式をとります。

例8-9 BPEL 2.0のbpelx:conversationId対話ID

<invoke ...>
  <bpelx:conversationId>$convId1</bpelx:conversationId>
</invoke>

<receive ...>
  <bpelx:conversationId>$convId1</bpelx:conversationId>
</receive>

<onMessage ...>
  <bpelx:conversationId>$convId2</bpelx:conversationId>
</onMessage>

8.3 実行時に使用するための動的パートナ・リンクの設計時の作成

SOAコンポジット・アプリケーションを設計する場合、次の課題に直面することがあります。

動的パートナ・リンク機能を使用すると、BPELバージョン1.1および2.0の実行時に使用するために、エンドポイント参照をパートナ・リンクに動的に割り当てることができます。動的パートナ・リンクでは、switchアクティビティに類似した条件が提供され、この条件は実行時に評価されます。

8.3.1 実行時に使用するための動的パートナ・リンクの設計時の作成方法

実行時に使用するために動的パートナ・リンクを設計時に作成する手順は、次のとおりです。

  1. 同じportTypeを使用する複数のサービスが含まれているWSDLファイルを作成します。

    <service name="AmericanLoan">
     <port name="LoanServicePort" binding="tns:LoanServiceBinding">
      <soap:address location="http://localhost:9700/orabpel/default/AmericanLoan"/>
     </port>
    </service>
    
    <service name="AlliedLoan">
     <port name="LoanServicePort" binding="tns:LoanServiceBinding">
      <soap:address location="http://localhost:9700/orabpel/default/AlliedLoan"/>
     </port>
    </service>
    
    <service name="AcmeLoan">
     <port name="LoanServicePort" binding="tns:LoanServiceBinding">
      <soap:address location="http://localhost:9700/orabpel/default/AcmeLoan"/>
     </port>
    </service>
    
  2. 「Webサービス」バインディング・コンポーネントをSOAコンポジット・エディタの「外部参照」スイムレーンにドラッグします。

    「Webサービスの作成」ダイアログが表示されます。

  3. Webサービスを定義して、「OK」をクリックします。

    完了すると、WSDLを使用するcomposite.xmlファイルの参照バインディング・コンポーネントのエントリは、次のようになります。

    <reference name="loanService">
      <interface.wsdl interface="http://services.otn.com#wsdl.interface(LoanService)"
    callbackInterface="http://services.otn.com#wsdl.interface(LoanServiceCallback)"
    />
        <binding.ws port=
           "http://services.otn.com#wsdl.endpoint(AmericanLoan/LoanService_pt)"/>
      </reference>
    

    注意:

    • binding.ws port設定の追加はオプションです。これは、Oracle BPEL Process Managerから渡されるプロパティによって、実行時にポートが上書きされるためです。

    • port設定がなく、この参照に関連付けられている具体WSDLのコンポジット・インポートもない場合は、location属性を使用して具体WSDLの場所を指定する必要があります。


  4. BPELプロセスをダブルクリックして、Oracle BPELデザイナを入力します。

  5. assignアクティビティをデザイナにドラッグします。

  6. 「コピー・ルール」タブをクリックします。

  7. 図8-3に示すように、ターゲット・パートナ・リンクの上にある「XMLフラグメント」アイコンを選択します。BPEL 2.0を使用中の場合は、「リテラル」アイコンをドラッグします。

    図8-3 「XMLフラグメント」アイコン

    図8-3の説明が続きます
    「図8-3 「XMLフラグメント」アイコン」の説明

  8. 「XMLフラグメント」アイコンをターゲット・パートナ・リンクにドラッグします。

    BPEL 1.1用の「XMLフラグメント」ダイアログが表示されます。BPEL 2.0を使用中の場合は、「リテラル」ダイアログが表示されます。

  9. エンドポイント参照を含むXMLフラグメントをパートナ・リンクに割り当てて、「OK」をクリックします。図8-4に詳細を示します。

    図8-4 BPEL 1.1の「XMLフラグメント」ダイアログ

    図8-4の説明が続きます
    「図8-4 BPEL 1.1の「XMLフラグメント」ダイアログ」の説明

    完了すると、BPELファイルにはWSDLで定義されたサービスのいずれかが含まれます。

    <copy>
       <from>
         <EndpointReference
            xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">
    <Address>http://myhost.us.oracle.com:9700/orabpel/default/AlliedLoan</Address>
        </EndpointReference>
       </from>
       <to partnerLink="LoanService"/>
    </copy> 
    

8.4 非同期サービスでのWS-Addressingの使用

ある時点でアクティブなインスタンスは多数存在する可能性があるため、サーバーはWebサービス・レスポンスに、対応する適切なBPELプロセス・サービス・コンポーネント・インスタンスを指示する必要があります。WS-Addressingを使用すると、非同期メッセージを識別して、非同期コールバックが確実に適切なクライアントを特定できるようにすることができます。

図8-5に、WS-Addressingの概要を示します。WS-Addressingは、非同期メッセージの相関にSimple Object Access Protocol(SOAP)ヘッダーを使用します。メッセージは、使用されるトランスポートまたはアプリケーションに依存しません。

図8-5 WS-Addressingヘッダーを使用したコールバック

図8-5の説明は次にあります。
「図8-5 WS-Addressingヘッダーを使用したコールバック」の説明

図8-5は、レスポンスが正しい宛先に送信されるように、メッセージがWSヘッダーとともに渡される様子を示しています。

この章の例では、相関にWS-Addressingを使用しています。メッセージの表示には、TCPトンネリングを使用できます。TCPトンネリングについては、第8.4.1.1項「プログラム間で交換されるメッセージのTCPトンネリングによる表示」で説明します。

WS-Addressingは、通常は通信プロトコルおよびメッセージ・システムで提供される次の情報を定義します。この情報は、トランスポートまたはアプリケーションに依存せずに処理されます。

8.4.1 非同期サービスでのWS-Addressingの使用方法

WS-Addressingは公開されている仕様であり、Oracle BPEL Process Managerでサポートされるデフォルトの相関方法です。WS-Addressingを使用するために、.bpelファイルおよび.wsdlファイルを編集する必要はありません。

8.4.1.1 プログラム間で交換されるメッセージのTCPトンネリングによる表示

プログラムとサービスの間で交換されるメッセージは、TCPトンネリングにより表示できます。これは、BPELプロセス・サービス・コンポーネント・フローとWebサービスの間で交換される正確なSOAPメッセージを表示する場合に、特に役立ちます。

SOAPメッセージを監視するには、フローとサービスの間にソフトウェア・リスナーを挿入します。フローはリスナー(TCPトンネル)と通信し、リスナーはサービスにメッセージを転送し、メッセージを表示します。同様に、サービスからのレスポンスはトンネルに返され、トンネルはレスポンスを表示してフローに返します。

サーバーとWebサービスの間で交換されたすべてのメッセージを表示する場合、該当するすべてのメッセージがサービスとの間で1回のリクエスト/リプライで交換されるため、同期サービスに対して必要なTCPトンネルは1つのみです。非同期サービスの場合、2つのトンネル(サービスの起動用に1つ、フローのコールバック・ポート用に1つ)を設定する必要があります。

8.4.1.1.1 同期サービス用のTCPリスナーの設定

Oracle BPEL Process Managerプロセスで開始される同期サービス用のTCPリスナーを設定する手順は、次のとおりです。

  1. Axis TCPモニター(tcpmon)のダウンロードおよびインストールの方法については、次のURLにアクセスしてください。

    http://ws.apache.org/commons/tcpmon/
    
  2. tcpmonの使用方法については、次のURLにアクセスしてください。

    http://ws.apache.org/axis/java/user-guide.html
    
  3. クラスパスにaxis.jarを設定します。

  4. tcpmonを開始します。

    C:\...\> java org.apache.axis.utils.tcpmon localport remoteHost
    port_on_which_remote_server_is_running
    
  5. composite.xmlファイルで、フローのbinding.wsの下にendpointURIプロパティを追加し、サービスのエンドポイントを上書きします。

  6. オペレーティング・システムのコマンド・プロンプトからantを使用して、プロセスをコンパイルおよびデプロイします。

    同じテクニックで、Axisや.NETなど、別のツール・キットからBPELプロセス・サービス・コンポーネントをWebサービスとして起動するために渡されるSOAPメッセージを参照できます。

8.4.1.1.2 非同期サービス用のTCPリスナーの設定

非同期サービスからのコールバックのSOAPメッセージを表示するTCPリスナーを設定する手順は、次のとおりです。

  1. ポートでのリスニングとOracle BPEL Process Managerポートの送信を実行するTCPリスナーを起動します。

    1. 「Oracle Enterprise Manager Fusion Middleware Control」を開きます。

    2. 「SOAインフラストラクチャ」メニューから、「SOA管理」「共有プロパティ」の順に選択します。

    3. 「コールバック・サーバーURL」に値を指定します。このURLは、サーバーによって非同期コールバック・アドレスの一部としてインボーカに送信されます。

  2. 「SOAインフラストラクチャ」メニューから、「管理」「システムMBeanブラウザ」の順に選択します。

  3. 「アプリケーション定義のMBean」oracle.soa.config「サーバー: soa_server」「SCAComposite」の順に展開します。

    soa_serverは、特定のサーバー・インスタンス名です(例: AdminServer)。

    サーバーにデプロイされているすべてのSOAコンポジット・アプリケーションが表示されます。

  4. 次の手順に従って、このプロパティをコンポジット・アプリケーションに設定します。このアクションにより、コンポジット・アプリケーションのすべてのバインディングにプロパティ設定が適用されます。

    1. コンポジットをクリックします。

    2. 「属性」タブが選択されていることを確認します。

    3. 「名前」列で、「プロパティ」をクリックします。

    4. 「追加」アイコンをクリックします。

    5. 新しく追加した「Element_number(リストの最後に表示されます)を開きます。

      numberは、最後のプロパティの番号の次の番号です。たとえば、プロパティ・リストに12個の要素があるときに新しいプロパティを追加すると、Element_13が表示されます。

    6. 「名前」フィールドに、oracle.webservices.local.optimizationと入力します。

    7. 「値」フィールドに、falseと入力します。

    8. 「複数」フィールドに、falseと入力します。

    9. 「適用」をクリックし、次に「戻る」をクリックします。

    10. 「操作」タブの「名前」列で、「保存」をクリックします。

    11. 「起動」をクリックして操作を実行します。

    12. 「戻る」をクリックするか、「システムMBeanブラウザ」ペインでノードをクリックします。


      注意:

      プロパティを追加、削除または更新した後は、「システムMBeanブラウザ」ページの右上隅にある「キャッシュされたツリー・データのリフレッシュ」アイコンをクリックすると、新しいデータを参照できます。


  5. 次の手順に従って、このプロパティを特定のバインディングに設定します。

    1. コンポジット・アプリケーションを開き、特定の「SCAComposite.SCAReference.SCABinding」フォルダにドリルダウンします。

    2. 「WSBinding」をクリックします。

    3. ステップ4bから4lを実行します。

  6. 非同期Webサービスを起動するフローを開始します。これを同期TCPトンネリング構成と組み合せると、サービス開始リクエストを最初のTCPトンネル経由で送信できます。

    非同期サービスからのコールバックは、TCPリスナーに表示されます。

Oracle JDeveloperユーザーは、組込みパケット・モニターを使用して、同期サービスと非同期サービスの両方についてSOAPメッセージを表示することもできます。