プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発
12c (12.1.3)
E53007-05
目次へ移動
目次

前
次

9 相関セットおよびメッセージ集約の使用

この章では、相関セットを使用して、非同期コールバックが確実に適切なクライアントを特定できるようにする方法について説明します。また、集約パターンを使用して、同じインスタンスにメッセージをルーティングする方法についても説明します。

この章の内容は次のとおりです。

9.1 非同期サービスでの相関セットの概要

相関セットは、Webサービスのレスポンスを適切なBPELプロセス・サービス・コンポーネント・インスタンスに戻すための方法を提供します。相関セットを使用すると、非同期メッセージを識別して、非同期コールバックが確実に適切なクライアントを特定できるようにすることができます。相関セットは、連携が単純なinvokeとreceiveアクティビティでない場合に定義します。

相関セットは、メッセージ本体の内容に基づいて非同期メッセージの相関を可能にするBPELメカニズムです。この方法を使用するには、BPELプロセスに相関セットを定義します。この方法は、WS-Addressingをサポートしないサービス用、または対話がA > B > AではなくA > B > C > Aという形式の場合など、一定の高度な対話パターン用に設計されています。

9.1.1 相関セットの使用のシナリオ

相関を使用すると、メッセージ本文の内容に基づいて非同期メッセージを関連付けることができます。すべてのビジネス・シナリオに相関が必要なわけではありません。

  • 同期コールでは、会話のコンテキストがスタックまたはTCP接続にわたって保持されるため、相関は必要ありません。

  • 通常、BPELプロセスに承諾することでメッセージが関連付けられ、WS-Addressingヘッダーを使用してWebアプリケーションでセッション・クッキーのように動作するトークンを渡します。詳細は、「非同期サービスでのWS-Addressingの使用」を参照してください。

相関は次のシナリオで必要です。次の各ケースでは、BPELプロセスはメッセージの内容の一部を表示するために構成する必要があり、これを使用してメッセージを受信するために適切なプロセス・インスタンスを選択します。

  • WS-Addressingをサポートしていない非同期サービスを使用している場合。

  • 別のシステムから要求していないメッセージを受信する場合。

  • メッセージが複数のサービスを経由し、最初のサービスによって最後のサービスからレスポンスが直接要求された場合。

  • ファイルを介して通信している場合。

9.1.2 相関セットの内容および概念の理解

この項では、主要な相関セットの概念に関する概要を説明します。

相関セットを使用する適切なBPELインスタンスは、次のように取得されます。

  • BPELプロセスは、カスタム相関を許可するために、相関セットと呼ばれる構成を提供します。

  • 相関セットは、メッセージを受信するための適切なプロセスを特定するためにBPELプロセス・サービス・エンジンが使用するプロパティの集合です。

  • 相関セット内の各プロパティは、プロパティ・エイリアスを介して1つ以上のメッセージ・タイプの要素にマッピングできます。図9-1に概要を示します。

次の主な相関のガイドラインに注意してください。

  • メッセージを受信するプロセスのみが相関に関係します。以前のアクティビティと関連付けるために送信サービスに十分な情報がメッセージに含まれているかぎりは、相関が発生していることを送信者が認識する必要はありません。

  • 相関プロパティは、それを設定するBPELプロセスが存続している間は一意である必要があります。

  • 2つのプロセスが同じ相関トークンを使用していることを確認します。たとえば、プロセスで2つの異なるインスタンスを開始する場合、経費請求プロセスを関連付けるために社会保障番号を使用することは推奨されません。

  • プロパティは、値または注文書や発注番号などの実際のビジネス識別子から構成できます。文字列である必要はなく、任意の適当なXMLタイプを使用できます。

主な相関概念の属性は次のとおりです。相関ウィザードで相関セットを設計するときに、Oracle JDeveloperでこれらの属性を設定します。

  • initiate属性は次のように設定されます。

    • はい: 相関セットは、転送されるメッセージで使用可能なプロパティの値を使用して開始されます。

    • いいえ: 相関セットは、メッセージで使用可能なプロパティの値を検証します。

  • pattern属性は次のように設定されます。

    • イン (BPEL 1.1の場合)またはレスポンス (BPEL 2.0の場合): 相関プロパティは、受信メッセージ上で設定および検証されます。

    • アウト (BPEL 1.1の場合)またはリクエスト (BPEL 2.0の場合): 相関プロパティは、送信BPELメッセージ上で設定および検証されます。

    • アウト-イン (BPEL 1.1の場合)またはリクエスト/レスポンス (BPEL 2.0の場合): 相関プロパティは、受信と送信メッセージの両方で設定および検証されます。

  • プロパティ・エイリアスは、グローバル・プロパティを特定のメッセージ・パートのフィールドにマッピングします。このアクションにより、プロパティ名を、メッセージのパートと場所を表すエイリアスにできます。このエイリアスは、XPath式で使用できます。

9.1.3 相関セットの作成の概要

表9-1に、相関セットの作成に必要な手順の概要を示します。これらの手順を実行する相関ウィザードのページへの参照および設定する値の例を説明します。


表9-1 相関セットの作成の概要

手順 相関ウィザードのページ

交換を関連付けるプロパティ名およびタイプを使用して相関セットを作成します。

この情報は、相関ウィザードの「相関セットの定義」ページで設定します。図9-2を参照してください。

次のプロパティ名およびタイプを使用してphonenumber相関セットを作成します。

  • 文字列型username

  • int型userordernumber

  • ブール型IsGift

会話を開始するinvokeアクティビティまたはreceiveアクティビティに相関を追加し、「開始」「はい」に設定します。

相関ウィザードの「設定の開始」ページで、アクティビティを選択して「開始」属性を設定します。図9-3を参照してください。

「internalReceive」 receiveアクティビティを選択して、「開始」「はい」に設定します。

プロパティ・エイリアスのマッピングを各メッセージの適切な要素に作成します。会話の両方のメッセージで同じ値を持つ必要があります。要素は、2つのメッセージで異なる名前および異なる構造にできますが、相関を機能させるには、メッセージに同じ値が含まれている必要があります。

この情報は、相関ウィザードの「プロパティ・エイリアス」ページで設定します。図9-7を参照してください。このページでは次の2つのエディタを使用でき、このエディタを使用してプロパティ・エイリアスのマッピングを作成できます。

  • エイリアス・エディタ(図9-4)

  • エイリアス・ドラッグ・アンド・ドロップ・エディタ(図9-5)

相関セットのプロパティ値を実行時に移入するためにプロパティ・エイリアスを定義します。

  • エイリアスのusernamenameメッセージ要素にマッピングします。

  • エイリアスのuserordernumberpoNumberメッセージ要素にマッピングします。

  • エイリアスのIsGiftgiftメッセージ要素にマッピングします。

そのプロパティを使用して同じ相関セットを追加のアクティビティに追加します。それらを「開始」に設定しないでください。BPELプロセスをこれを使用して適切なプロセス・インスタンスを選択します。パターンを適切に設定します。

アクティビティ相関エディタの「開始」タブで設定します。図9-10を参照してください。

「internalCallback」 invokeアクティビティを選択します。

  • 「開始」「いいえ」に設定します。

  • 「パターン」「リクエスト」に設定します。


9.2 Oracle JDeveloperにおける相関セットの作成

相関セットを次のアクティビティとブランチで作成できます。

  • receiveアクティビティ

  • replyアクティビティ

  • invokeアクティビティ

  • onMessageブランチ

  • onEventブランチ

Oracle JDeveloperで相関セットを作成する方法は2種類あります。

  • アクティビティの相関ウィザードを使用した自動の方法

  • アクティビティの「相関」タブを使用した手動の方法

9.2.1 相関ウィザードで相関セットを作成する方法

相関ウィザードで相関セットを作成する手順は、次のとおりです。

  1. 適切なアクティビティ(receiveアクティビティなど)を右クリックし、「相関の設定」を選択します。

    相関ウィザードの「相関セットの定義」ページが表示されます。

  2. 環境に適したレスポンスを指定してから、「次へ」をクリックします。表9-2に詳細を示します。


    表9-2 「相関ウィザード」の「相関セットの定義」ページ

    フィールド 説明

    相関セットの作成

    選択すると新しい相関セットが作成されます。

    既存の相関セットの選択

    選択アクティビティを含ませるための既存相関セットを選択します。

    名前

    作成する相関セットの名前を入力します。

    スコープ

    新しい相関セットを作成するスコープまたはプロセスが表示されます。

    プロパティ

    1. 「追加」をクリックし、「プロパティ」表の「名前」列で新規プロパティを作成するか、「参照」をクリックし、既存プロパティを選択します。

    2. 「タイプ」列をクリックしてから、省略記号をクリックし、「タイプ・チューザ」ダイアログを起動して、プロパティ・タイプを選択します(たとえば、整数やブールなどのタイプ)。


    完了すると、相関ウィザードの「相関セットの定義」ページは図9-2のようになります。

    図9-2 「相関ウィザード」の「相関セットの定義」ページ

    図9-2の説明が続きます
    「図9-2 相関ウィザードの「相関セットの定義」ページ」の説明

    相関ウィザードの「設定の開始」ページが表示されます。

  3. 環境に適したレスポンスを指定してから、「次へ」をクリックします。表9-3に詳細を示します。


    表9-3 「相関ウィザード」の「設定の開始」ページ

    フィールド 説明

    アクティビティ

    相関が設定されるアクティビティが表示されます。

    開始

    このアクティビティが相関セットでイニシエータであるかどうかを選択します。

    「はい」に設定されると、相関セットは、送受信されるメッセージで発生するプロパティの値を使用して開始されます。


    完了すると、相関ウィザードの「設定の開始」ページは図9-3のようになります。

    図9-3 「相関ウィザード」の「設定の開始」ページ

    図9-3の説明が続きます
    「図9-3 「相関ウィザード」の「設定の開始」ページ」の説明

    相関ウィザードの「プロパティ・エイリアス」ページが、プロパティを値にマッピングするために表示されます。ウィザードの「相関セットの定義」ページで以前に定義されたプロパティが、「プロパティ・エイリアス」表に表示されます。

    「プロパティ・エイリアス」により、変数の特定メッセージ・パートでプロパティをフィールドにマッピングできます。このアクションにより、プロパティをメッセージのパートと場所のエイリアスにできます。

  4. プロパティを表でクリックし、変数のメッセージ・パートをプロパティにマッピングする方法を選択します。表9-4に詳細を示します。


    表9-4 変数メッセージ・パートをプロパティにマッピングする方法

    使用対象 移動先の手順

    エイリアス・エディタ

    5

    エイリアス・ドラッグ・アンド・ドロップ・エディタ

    6


  5. 「編集」(1番目)アイコンをクリックして、「エイリアス・エディタ」ダイアログを起動します。

    1. 変数を展開します。

    2. プロパティを示すメッセージ・パートを選択して、「OK」をクリックします。図9-4に詳細を示します。

      図9-4 エイリアス・エディタ

      図9-4の説明が続きます
      「図9-4 エイリアス・エディタ」の説明
  6. 「エイリアス・ドラッグ・アンド・ドロップ・エディタ」(2番目)アイコンをクリックして、「エイリアス・ドラッグ・アンド・ドロップ・エディタ」ダイアログを起動します。

    1. 変数を展開します。

    2. プロパティを示すメッセージ・パートを選択します。

    3. メッセージ・パートを相関ウィザードの「プロパティ・エイリアス」ページのプロパティ行にドラッグ・アンド・ドロップします。図9-5に詳細を示します。

      図9-5 エイリアス・ドラッグ・アンド・ドロップ・エディタ

      図9-5の説明が続きます
      「図9-5 エイリアス・ドラッグ・アンド・ドロップ・エディタ」の説明

      図9-6に示すとおり、既存のプロパティ・エイリアスが相関ウィザードの「プロパティ・エイリアス」ページの下の部分にリストされます。この例では、既存のプロパティ・エイリアスはありません。

      図9-6 相関ウィザードの「プロパティ・エイリアス」ページの下の部分

      図9-6の説明が続きます
      「図9-6 相関ウィザードの「プロパティ・エイリアス」ページの下の部分」の説明
    4. 完了したら、「次へ」をクリックします。

  7. 変数の特定メッセージ・パートをプロパティにマッピングするプロパティをさらに選択します。

    完了すると、相関ウィザードの「プロパティ・エイリアス」ページは図9-7のようになります。図9-2で作成したプロパティが「プロパティ」列に表示されます。エイリアス・エディタ(図9-4)またはエイリアス・ドラッグ・アンド・ドロップ・エディタ(図9-5)を使用してプロパティがマッピングされたメッセージ要素が「問合せ」列に表示されます。

    図9-7 「相関ウィザード」の「プロパティ・エイリアス」ページ

    図9-7の説明が続きます
    「図9-7 「相関ウィザード」の「プロパティ・エイリアス」ページ」の説明
  8. 「次へ」をクリックします。

    相関ウィザードの「相関されたアクティビティ」ページが表示されます。図9-8に詳細を示します。

    図9-8 「相関ウィザード」の「プロパティ・エイリアス」ページ(アクティビティなし)

    図9-8の説明が続きます
    「図9-8 「相関ウィザード」の「プロパティ・エイリアス」ページ(アクティビティなし)」の説明
  9. 「追加」アイコンをクリックし、さらにアクティビティを相関セットに追加します(複数のアクティビティをこの相関セットに関連付けることができます)。

    「アクティビティ・ブラウザ」ダイアログが表示されます。

  10. 追加するアクティビティを選択して「OK」をクリックします。図9-9に詳細を示します。

    図9-9 アクティビティを選択するためのアクティビティ・ブラウザ

    図9-9の説明が続きます
    「図9-9 アクティビティを選択するためのアクティビティ・ブラウザ」の説明

    相関ウィザードの「相関されたアクティビティ」ページの「相関アクティビティ」フィールドにこのアクティビティが追加されます。

  11. 「相関アクティビティ」フィールドで、アクティビティを選択し、「編集」をクリックして、「アクティビティ相関エディタ」ダイアログの「開始」タブを起動します。図9-10に詳細を示します。

    図9-10 「アクティビティ相関エディタ」の「開始」タブ

    図9-10の説明が続きます
    「図9-10 「アクティビティ相関エディタ」の「開始」タブ」の説明
  12. 「開始」リストおよび「パターン」リストから適切な値を選択します。この例では、次のように指定します。

    • 「開始」リストから「いいえ」を選択します(相関セットがメッセージ内の使用可能なプロパティを検証するため)。

    • Patternリストから「リクエスト」を選択します(相関プロパティは、送信BPELメッセージ上で設定および検証されるため)。

    BPEL 2.0では、相関がインバウンド・メッセージに適用される場合は「レスポンス」を、相関がアウトバウンド・メッセージに適用される場合は「リクエスト」を、または相関がアウトバウンド・メッセージとインバウンド・メッセージの両方に適用される場合は「リクエスト/レスポンス」を選択できます。

    BPEL 1.1では、相関がインバウンド・メッセージ(レスポンス)に適用される場合は「イン」を、相関がアウトバウンド・メッセージ(リクエスト)に適用される場合は「アウト」を、または相関がアウトバウンド・メッセージとインバウンド・メッセージの両方(レスポンスとリクエスト)に適用される場合は「アウト-イン」を選択できます。

  13. 「エイリアス」タブをクリックします。

  14. 手順4から手順7まで繰り返して、変数のメッセージ・パートをプロパティにマッピングする方法とプロパティを選択します。

    完了すると、「エイリアス」ダイアログは図9-11のようになります。

    図9-11 アクティビティ相関エディタの「エイリアス」タブ

    図9-11の説明が続きます
    「図9-11 アクティビティ相関エディタの「エイリアス」タブ」の説明
  15. 「OK」をクリックして、相関ウィザードの「相関されたアクティビティ」ページに戻ります(図9-12のように表示されます)。

    図9-12 「相関ウィザード」の「相関されたアクティビティ」ページ(アクティビティが選択された状態)

    図9-12の説明が続きます
    「図9-12 「相関ウィザード」の「相関されたアクティビティ」ページ(アクティビティが選択された状態)」の説明
  16. 「次へ」をクリックし、「アクティビティ」「相関セット」および「エイリアス」のタブの詳細を確認します。

    • アクティビティ: 相関とロールに関連するアクティビティが表示されます(たとえば、receiveアクティビティはイニシエータで、invokeアクティビティは応答者)。

    • 相関セット: 相関セットの名前が表示されます。

    • エイリアス: 相関セットでアクティビティ用に定義されたプロパティ・エイリアスが表示されます。

    図9-13に詳細を示します。

    図9-13 「相関ウィザード」の「サマリー」ページ

    図9-13の説明が続きます
    「図9-13 「相関ウィザード」の「サマリー」ページ」の説明
  17. 「終了」をクリックします。

    相関セットが作成されます。

  18. 「構造」ウィンドウに、相関ウィザードで定義した相関セット、プロパティおよびプロパティ・エイリアスを表示します。

  19. Oracle BPELデザイナで、いずれかの参加アクティビティの「相関」タブをクリックし、定義した詳細を表示します(たとえば、receiveアクティビティ)。図9-14に詳細を示します。

    図9-14 receiveアクティビティの「相関」タブ

    図9-14の説明が続きます
    「図9-14 receiveアクティビティの「相関」タブ」の説明
  20. 相関セットで使用されるアクティビティを調べる場合、次の手順を実行します。

    1. Oracle BPELデザイナの上にある「検索」アイコンをクリックして、「相関検索」を選択します。

      「相関セット・チューザ」ダイアログが表示されます。

    2. 相関セットを選択して「OK」をクリックします。

    3. 「相関検索」で、「OK」をクリックします。

      相関セットを使用するアクティビティが「ログ」ウィンドウに表示されます。

  21. 別のアクティビティを既存の相関セットに追加する場合、アクティビティを右クリックし、「相関の設定」を選択します。

    相関ウィザードの「相関セットの定義」ページが表示されます。

  22. 「既存の相関セットの選択」を選択します。

  23. 「相関セット」リストで、相関セットを選択し、「OK」をクリックします。

  24. 相関ウィザードの各ページに従ってアクティビティを定義します。

9.2.2 「相関」タブで相関セットを手動で作成する方法

この項では、非同期サービスで相関セットを手動で作成するための手順について説明します。この例では、invokeアクティビティが関連付けられていないreceiveアクティビティを3つ含むプロセスに相関セットを使用する方法を示します。

9.2.2.1 ステップ1: プロジェクトの作成

プロジェクトを作成するには:

  1. Oracle JDeveloperを起動します。
  2. 「ファイル」メイン・メニューから、「新規」「アプリケーション」を選択します。
  3. 「SOAアプリケーション」を選択し、「OK」をクリックします。

    SOAアプリケーションの作成ウィザードが表示されます。

  4. 「アプリケーション名」フィールドに、名前を入力します(この例ではMyCorrelationSetAppが入力されています)。
  5. 残りのすべての設定に対するデフォルト値をそのまま使用し、「次へ」をクリックします。
  6. 「プロジェクト名」フィールドに、名前を入力します(この例ではMyCorrelationSetCompositeが入力されています)。
  7. 残りのすべての設定に対するデフォルト値をそのまま使用し、「次へ」をクリックします。
  8. 「コンポジット・テンプレート」セクションで、BPELプロセスを使用するコンポジットを選択し、「終了」をクリックします。

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

  9. 表9-5に示されている値を入力します。

    表9-5 「BPELプロセスの作成」ダイアログのフィールドと値

    フィールド

    名前

    名前を入力します(この例ではMyCorrelationSetが入力されています)。

    テンプレート

    「非同期BPELプロセス」を選択します。

    SOAPサービスとして公開

    チェック・ボックスを選択します。プロセスを作成すると、SOAPサービスが「公開されたサービス」スイムレーンに表示されることに注意してください。このサービスは外部からコンポジット・アプリケーションへのエントリ・ポイントを提供します。


  10. 残りのすべての設定に対するデフォルト値をそのまま使用し、「OK」をクリックします。

9.2.2.2 ステップ2: パートナ・リンクとファイル・アダプタ・サービスの構成

次に、SOAPサービスを使用する3つのパートナ・リンクを作成します。

この項の内容は次のとおりです。

  • 融資申請読取り用のアダプタ・サービスを持つ最初のパートナ・リンクを作成します。

  • 申請レスポンス読取り用のアダプタ・サービスを持つ2番目のパートナ・リンクを作成します。

  • 顧客レスポンス読取り用のアダプタ・サービスを持つ3番目のパートナ・リンクを作成します。

9.2.2.2.1 初期パートナ・リンクとファイル・アダプタ・サービスの作成

最初のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。

  1. 「MyCorrelationSet」BPELプロセスをダブルクリックします。
  2. 「コンポーネント」ウィンドウで、「BPELコンストラクト」を開きます。
  3. 最初の「パートナ・リンク」アクティビティをデザイナの右スイムレーンにドラッグします。
  4. 最上部の3つ目のアイコン(「サービス・ウィザード」アイコン)をクリックします。図9-15に示すように、この操作でアダプタ構成ウィザードが起動します。

    図9-15 アダプタ構成ウィザードの起動

    図9-15の説明が続きます
    「図9-15 アダプタ構成ウィザードの起動」の説明
  5. 「サービスまたはアダプタの設定」ダイアログで「ファイル」を選択し、「OK」をクリックします。
  6. ファイル・アダプタの「参照」ダイアログの「名前」フィールドで、名前を入力して(この例では、FirstReceiveが入力されています)「次へ」をクリックします。
  7. 「アダプタ・インタフェース」ダイアログで、デフォルト設定をそのまま使用し、「次へ」をクリックします。
  8. 「操作」ダイアログで「操作タイプ」として「Read File」を選択し、「次へ」をクリックします。「操作名」フィールドには、Readが自動的に入力されます。
  9. 「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
  10. ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\FirstInputDirを選択します)。
  11. 「選択」をクリックします。
  12. 「次へ」をクリックします。
  13. 「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ・パラメータを入力します。
  14. 「次へ」をクリックします。
  15. 「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
  16. 「次へ」をクリックします。
  17. 「メッセージ」ダイアログで「URL」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
  18. 適切なXSDスキーマ・ファイルを選択します。この例では、Book1_4.xsdはスキーマであり、スキーマ要素としてLoanApplが選択されています。
  19. 「OK」をクリックします。

    「URL」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_4.xsdLoanAppl)。

  20. 「次へ」をクリックします。
  21. 「終了」をクリックします。

    「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表9-6のようになります。


    表9-6 「パートナ・リンク」ダイアログのフィールドと値

    フィールド

    名前

    FirstReceive

    WSDL URL

    directory_path/FirstReceive.wsdl

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

    Read_plt

    パートナ・ロール

    指定しません。

    マイ・ロール

    Read_role


  22. 「OK」をクリックします。
9.2.2.2.2 2番目のパートナ・リンクとファイル・アダプタ・サービスの作成

2番目のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。

  1. 2番目の「パートナ・リンク」アクティビティを「FirstReceive」パートナ・リンク・アクティビティの下にドラッグします。
  2. 最上部の3つ目のアイコン(「サービス・ウィザード」アイコン)をクリックします。
  3. 「サービスまたはアダプタの設定」ダイアログで「ファイル」を選択し、「OK」をクリックします。
  4. ファイル・アダプタの「参照」ダイアログの「名前」フィールドで、名前を入力して(この例では、SecondFileReadが入力されています)「次へ」をクリックします。この名前は、「最初のパートナ・リンクとファイル・アダプタ・サービスの作成」の手順6で入力した名前とは異なる必要があります。
  5. 「アダプタ・インタフェース」ダイアログで、デフォルト設定をそのまま使用し、「次へ」をクリックします。
  6. 「操作」ダイアログで「操作タイプ」として「Read File」を選択します。
  7. 「操作名」フィールドで、名前を変更します(この例ではRead1が入力されています)。
  8. 「次へ」をクリックします。
  9. 「物理パス」として「ディレクトリ名は次の方法で指定します」を選択します。
  10. 「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
  11. ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\SecondInputDirと入力します)。
  12. 「選択」をクリックします。
  13. 「次へ」をクリックします。
  14. 「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ処理パラメータを入力します。
  15. 「次へ」をクリックします。
  16. 「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
  17. 「次へ」をクリックします。
  18. 「メッセージ」ダイアログで「URL」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
  19. 適切なXSDスキーマ・ファイルを選択します。この例では、Book1_5.xsdはスキーマであり、スキーマ要素としてLoanAppResponseが選択されています。
  20. 「OK」をクリックします。

    「URL」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_5.xsdLoanAppResponse)。

  21. 「次へ」をクリックします。
  22. 「終了」をクリックします。

    「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表9-7のようになります。


    表9-7 「パートナ・リンク」ダイアログのフィールドと値

    フィールド

    名前

    SecondReceive

    WSDL URL

    directory_path/SecondFileRead.wsdl

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

    Read1_plt

    パートナ・ロール

    指定しません。

    マイ・ロール

    Read1_role


  23. 「OK」をクリックします。
9.2.2.2.2.1 3番目のパートナ・リンクとファイル・アダプタ・サービスの作成

3番目のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。

  1. 3番目の「パートナ・リンク」アクティビティを「SecondReceive」パートナ・リンク・アクティビティの下にドラッグします。
  2. 最上部の3つ目のアイコン(「サービス・ウィザード」アイコン)をクリックします。
  3. 「サービスまたはアダプタの設定」ダイアログで「ファイル」を選択し、「OK」をクリックします。
  4. ファイル・アダプタの「参照」ダイアログの「名前」フィールドで、名前を入力して(この例では、ThirdFileReadが入力されています)「次へ」をクリックします。この名前は、「最初のパートナ・リンクとファイル・アダプタ・サービスの作成」の手順6および「2番目のパートナ・リンクとファイル・アダプタ・サービスの作成」の手順4で入力した名前とは異なる必要があります。
  5. 「アダプタ・インタフェース」ダイアログで、デフォルト設定をそのまま使用し、「次へ」をクリックします。
  6. 「操作」ダイアログで「操作タイプ」として「Read File」を選択します。
  7. 「操作名」フィールドで、名前を変更します(この例ではRead2が入力されています)。この名前は一意である必要があります。
  8. 「次へ」をクリックします。
  9. 「物理パス」として「ディレクトリ名は次の方法で指定します」を選択します。
  10. 「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
  11. ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\ThirdInputDirと入力します)。
  12. 「選択」をクリックします。
  13. 「次へ」をクリックします。
  14. 「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ処理パラメータを入力します。
  15. 「次へ」をクリックします。
  16. 「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
  17. 「次へ」をクリックします。
  18. 「メッセージ」ダイアログで「URL」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
  19. 適切なXSDスキーマ・ファイルを選択します。この例では、Book1_6.xsdはスキーマであり、スキーマ要素としてCustResponseが選択されています。
  20. 「OK」をクリックします。

    「URL」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_6.xsdCustResponse)。

  21. 「次へ」をクリックします。
  22. 「終了」をクリックします。

    「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表9-8のようになります。


    表9-8 「パートナ・リンク」ダイアログのフィールドと値

    フィールド

    名前

    ThirdReceive

    WSDL URL

    directory_path/ThirdFileRead.wsdl

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

    Read2_plt

    パートナ・ロール

    指定しません。

    マイ・ロール

    Read2_role


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

9.2.2.3 ステップ3: 3つのreceiveアクティビティの作成

次に、3つのreceiveアクティビティ(各パートナ・リンクにつき1つずつ)を作成します。receiveアクティビティでは、情報の送信元のパートナ・リンクを指定します。

9.2.2.3.1 最初のreceiveアクティビティの作成

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

  1. 「コンポーネント」ウィンドウで、「BPELコンストラクト」を展開します。
  2. デザイナの「receiveInput」receiveアクティビティの下に、「Receive」アクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをクリックして、そのプロパティ・フィールドをプロパティ・インスペクタで表示するか、「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。

    アクティビティをプロパティ・インスペクタで編集する方法の詳細は、「BPELアクティビティをプロパティ・インスペクタで編集する方法」を参照してください。

  4. 表9-9に示す詳細を入力して、最初のパートナ・リンク(FirstReceive)を最初のreceiveアクティビティと関連付けます。

    表9-9 「Receive」ダイアログのフィールドと値

    フィールド

    名前

    receiveFirst

    パートナ・リンク

    FirstReceive

    インスタンスの作成

    このチェック・ボックスを選択します。


    「操作」(Read)フィールドは自動的に入力されます。

  5. 「変数」フィールドの右側にある最初のアイコンをクリックします。これは、変数を自動作成するアイコンです。
  6. 「変数の作成」ダイアログで「OK」をクリックします。

    receiveFirst_Read_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。

  7. 手順4の説明に従って「インスタンスの作成」チェック・ボックスが選択されていることを確認します。
  8. 「OK」をクリックします。
9.2.2.3.2 2番目のreceiveアクティビティの作成

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

  1. 「コンポーネント」ウィンドウから、2番目のreceiveアクティビティを「receiveFirst」receiveアクティビティの下にドラッグします。
  2. 「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。
  3. 表9-10に示す詳細を入力して、2番目のパートナ・リンク(SecondReceive)を2番目のreceiveアクティビティと関連付けます。

    表9-10 「Receive」ダイアログのフィールドと値

    フィールド

    名前

    receiveSecond

    パートナ・リンク

    SecondFileRead

    インスタンスの作成

    このチェック・ボックスは選択しないでください。


    「操作」(Read1)フィールドは自動的に入力されます。

  4. 「変数」フィールドの右側にある最初のアイコンをクリックします。
  5. 「変数の作成」ダイアログで「OK」をクリックします。

    receiveSecond_Read1_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。

  6. 「OK」をクリックします。
9.2.2.3.2.1 3番目のreceiveアクティビティの作成

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

  1. 「コンポーネント」ウィンドウから、3番目のreceiveアクティビティを「receiveSecond」receiveアクティビティの下にドラッグします。
  2. 「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。
  3. 表9-11に示す詳細を入力して、3番目のパートナ・リンク(ThirdReceive)を3番目のreceiveアクティビティと関連付けます。

    表9-11 「Receive」ダイアログのフィールドと値

    フィールド

    名前

    receiveThird

    パートナ・リンク

    ThirdFileRead

    インスタンスの作成

    このチェック・ボックスは選択しないでください。


    「操作」(Read2)フィールドは自動的に入力されます。

  4. 「変数」フィールドの右側にある最初のアイコンをクリックします。
  5. 「変数の作成」ダイアログで「OK」をクリックします。

    receiveThird_Read2_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。

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

    各receiveアクティビティが、特定のパートナ・リンクに関連付けられました。

9.2.2.4 ステップ4: 相関セットの作成

次に、相関セットを作成します。相関トークンのセットは、相関グループのすべてのメッセージで共有されるプロパティのセットです。

9.2.2.4.1 最初の相関セットの作成

最初の相関セットを作成する手順は、次のとおりです。

  1. Oracle JDeveloperの「構造」ウィンドウで「相関セット」を右クリックし、「すべての子ノードを開く」を選択します。
  2. 2番目の「相関セット」フォルダを右クリックして、「相関セットの作成」を選択します。
  3. 「相関セットの作成」ダイアログの「名前」フィールドでCorrelationSet1と入力します。
  4. 「プロパティ」セクションで、「追加」アイコンをクリックして「プロパティ・チューザ」ダイアログを表示します。
  5. 「プロパティ」を選択し、「追加」アイコン(上の最初のアイコン)をクリックして「プロパティの作成」ダイアログを表示します。
  6. 「名前」フィールドに、NameCorrと入力します。
  7. 「タイプ」フィールドの右側にある「参照」アイコンをクリックします。
  8. 「タイプ・チューザ」ダイアログで「string」を選択し、「OK」をクリックします。
  9. 各ダイアログで、「OK」をクリックして、「プロパティの作成」ダイアログ、「プロパティ・チューザ」ダイアログおよび「相関セットの作成」ダイアログを閉じます。
9.2.2.4.2 2番目の相関セットの作成

2番目の相関セットを作成する手順は、次のとおりです。

  1. Oracle JDeveloperの「構造」ウィンドウの「相関セット」セクションに戻ります。
  2. 「相関セット」フォルダを右クリックして、「相関セットの作成」を選択します。
  3. 「相関セットの作成」ダイアログの「名前」フィールドでCorrelationSet2と入力します。
  4. 「プロパティ」セクションで、「追加」アイコンをクリックして「プロパティ・チューザ」ダイアログを表示します。
  5. 「プロパティ」を選択し、「追加」アイコンをクリックして「プロパティの作成」ダイアログを表示します。
  6. 「名前」フィールドに、IDCorrと入力します。
  7. 「タイプ」フィールドの右側にある「参照」アイコンをクリックします。
  8. 「タイプ・チューザ」ダイアログで「double」を選択し、「OK」をクリックします。
  9. 各ダイアログで、「OK」をクリックして、「プロパティの作成」ダイアログ、「プロパティ・チューザ」ダイアログおよび「相関セットの作成」ダイアログを閉じます。

9.2.2.5 ステップ5: 相関セットとreceiveアクティビティの関連付け

次に、相関セットをreceiveアクティビティと関連付けます。次の相関セットのタスクを実行します。

  • 最初の相関グループで、最初と2番目のreceiveアクティビティをCorrelationSet1相関セットと関連付けます。

  • 2番目の相関グループで、2番目と3番目のreceiveアクティビティをCorrelationSet2相関セットと関連付けます。

9.2.2.5.1 最初の相関セットのreceiveアクティビティへの関連付け

最初の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。

  1. 「receiveFirst」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
  2. 「相関」タブをクリックします。
  3. 「追加」アイコンをクリックして、「相関セット」ドロップダウン・リストを表示します。
  4. 「CorrelationSet1」を選択します。
  5. 「開始」列をクリックしてドロップダウン・リストを表示し、「はい」を選択します。「はい」に設定すると、このセットが、交換するメッセージに含まれるプロパティの値で開始されます。
  6. 「OK」をクリックします。
9.2.2.5.2 2番目の相関セットのreceiveアクティビティへの関連付け

2番目の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。

  1. 「receiveSecond」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
  2. 「相関」タブをクリックします。
  3. 「追加」アイコンをクリックして、「相関セット」ドロップダウン・リストを表示します。
  4. 「CorrelationSet2」を選択し、次に「OK」をクリックします。
  5. 「開始」列をクリックしてドロップダウン・リストを表示し、「はい」を選択します。
  6. 「追加」を再度クリックし、「CorrelationSet1」を選択します。
  7. 「OK」をクリックします。
  8. 「開始」列をクリックしてドロップダウン・リストを表示し、「CorrelationSet1」「いいえ」を選択します。
  9. 「OK」をクリックします。

    これにより、最初と2番目のreceiveアクティビティが1つの相関グループにまとめられます。

9.2.2.5.3 3番目の相関セットのreceiveアクティビティへの関連付け

3番目の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。

  1. 「receiveThird」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
  2. 「相関」タブをクリックします。
  3. 「追加」アイコンをクリックします。
  4. 「CorrelationSet2」を選択します。
  5. CorrelationSet2「開始」列を「いいえ」に設定します。
  6. 「OK」をクリックします。

    これにより、2番目と3番目のreceiveアクティビティが2番目の相関グループにまとめられます。

9.2.2.6 ステップ6: プロパティ・エイリアスの作成

プロパティ・エイリアスを使用すると、グローバル・プロパティを特定のメッセージ・パートのフィールドにマップできます。このアクションにより、プロパティ名を、メッセージのパートと場所を表すエイリアスにできます。このエイリアスは、XPath式で使用できます。

9.2.2.6.1 NameCorrのプロパティ・エイリアスの作成

NameCorr相関セットに次の2つのプロパティ・エイリアスを作成します。

  • NameCorrreceiveFirst receiveアクティビティのLoanApplメッセージ・タイプ・パートにマップします。このreceiveアクティビティをFirstReceiveパートナ・リンク(FirstReceive.wsdlファイルで定義)と関連付けます。

  • NameCorrreceiveSecond receiveアクティビティの受信メッセージ・タイプ・パートLoanAppResponseにマップします。このreceiveアクティビティをSecondReceiveパートナ・リンク(SecondFileRead.wsdlファイルで定義)と関連付けます。

NameCorrのプロパティ・エイリアスを作成する手順は、次のとおりです。

  1. Oracle JDeveloperの「構造」ウィンドウで、「プロパティ・エイリアス」を右クリックします。
  2. 「プロパティ・エイリアスの作成」を選択します。
  3. 「プロパティ」リストから「NameCorr」を選択します。
  4. 「メッセージ・タイプ」「パートナ・リンク」「FirstReceive」「FirstReceive.wsdl」「メッセージ・タイプ」「LoanAppl_msg」「Part - LoanAppl」の順に展開して選択します。
  5. 「問合せ」フィールドで[Ctrl]を押しながら[Space]を押して、次のXPath式を定義します。
    /ns2:LoanAppl/ns2:Name
    
  6. 「OK」をクリックします。
  7. ステップ1から3を繰り返して、NameCorrの2番目のプロパティ・エイリアスを作成します。
  8. 「メッセージ・タイプ」「プロジェクトのWSDLファイル」「SecondFileRead.wsdl」「メッセージ・タイプ」「LoanAppResponse_msg」「Part - LoanAppResponse」の順に展開して選択します。
  9. 「問合せ」フィールドで[Ctrl]を押しながら[Space]を押して、次のXPath式を定義します。
    /ns4:LoanAppResponse/ns4:APR
    
  10. 「OK」をクリックします。
9.2.2.6.2 IDCorrのプロパティ・エイリアスの作成

IDCorr相関セットに次の2つのプロパティ・エイリアスを作成します。

  • IDCorrreceiveSecond receiveアクティビティのLoanAppResponseメッセージ・タイプ・パートにマップします。このreceiveアクティビティをSecondReceiveパートナ・リンク(SecondFileRead.wsdlファイルで定義)と関連付けます。

  • IDCorrreceiveThird receiveアクティビティのCustResponseメッセージ・タイプ・パートにマップします。このreceiveアクティビティをThirdReceiveパートナ・リンク(ThirdFileRead.wsdlファイルで定義)と関連付けます。

IDCorrのプロパティ・エイリアスを作成する手順は、次のとおりです。

  1. 「構造」ウィンドウで、「プロパティ・エイリアス」を右クリックします。
  2. 「プロパティ・エイリアスの作成」を選択します。
  3. 「プロパティ」リストから「IDCorr」を選択します。
  4. 「メッセージ・タイプ」「プロジェクトのWSDLファイル」「SecondFileRead.wsdl」「メッセージ・タイプ」「LoanAppResponse_msg」「Part - LoanAppResponse」の順に展開して選択します。
  5. 「問合せ」フィールドで[Ctrl]を押しながら[Space]を押して、次のXPath式を定義します。
    /ns4:LoanAppResponse/ns4:APR
    
  6. 「OK」をクリックします。
  7. ステップ1から3を繰り返して、IDCorrの2番目のプロパティ・エイリアスを作成します。
  8. 「メッセージ・タイプ」「プロジェクトのWSDLファイル」「ThirdFileRead.wsdl」「メッセージ・タイプ」「CustResponse_msg」「Part - CustResponse」の順に展開して選択します。
  9. 「問合せ」フィールドで[Ctrl]を押しながら[Space]を押して、次のXPath式を定義します。
    /ns6:CustResponse/ns6:APR
    

    これで、設計は完了します。

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

9.2.2.7 ステップ7: WSDLファイルのコンテンツの確認

WSDLファイルのコンテンツを確認する手順は、次のとおりです。

  1. 「アプリケーション」ウィンドウをリフレッシュします。

    相関セット・プロパティのNameCorrおよびIDCorrは、「アプリケーション」ウィンドウのMyCorrelationSet_Properties.wsdlファイルに定義されています。

    <definitions
         name="properties"
         targetNamespace="http://xmlns.oracle.com/MyCorrelationSet/correlationset"
         xmlns="http://schemas.xmlsoap.org/wsdl/"
         xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
         xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <bpws:property name="NameCorr" type="xsd:string"/>
        <bpws:property name="IDCorr" type="xsd:double"/>
    </definitions>
    

    プロパティ・エイリアスは、MyCorrelationSet.wsdlファイルに定義されています。

    <bpws:propertyAlias propertyName="ns1:NameCorr"
     messageType="ns3:LoanAppl_msg"
     part="LoanAppl" query="/ns2:LoanAppl/ns2:Name"/>
    
    <bpws:propertyAlias propertyName="ns1:NameCorr" 
     messageType="ns5:LoanAppResponse_msg" 
     part="LoanAppResponse" query="/ns4:LoanAppResponse/ns4:APR"/>
    
    <bpws:propertyAlias propertyName="ns1:IDCorr" 
     messageType="ns5:LoanAppResponse_msg" 
     part="LoanAppResponse" query="/ns4:LoanAppResponse/ns4:APR"/>
    
    <bpws:propertyAlias propertyName="ns1:IDCorr" 
     messageType="ns7:CustResponse_msg" 
     part="CustResponse" query="/ns6:CustResponse/ns6:APR"/>

    この例では、BPELプロセス・サービス・コンポーネントはWebサービス・プロバイダとしては作成されていないので、MyCorrelationSet.wsdlファイルはBPELプロセス・サービス・コンポーネントでは参照されません。このため、旧WSDLに定義されている相関セットを参照するには、MyCorrelationSet.wsdlファイルをFirstReceive.wsdlファイル内にインポートする必要があります。

    <import namespace="http://xmlns.oracle.com/MyCorrelationSet"
     location="MyCorrelationSet.wsdl"/>

9.2.3 変換IDおよび異なるコンポジット・リビジョンに関する必知事項

SOAコンポジット・アプリケーションの違うリビジョンに同じ変換IDを使用しないでください。BPELプロセスで相関セットを使用する場合は、ユーザーが明示的に対話IDの値を管理します。対話IDの値の生成に関して、Oracle SOA Suiteによって妨害や制約が追加されることはありません。これは、Oracle SOA Suiteで違うリビジョンに対して同じ対話IDが生成されているように見えても、実際はユーザーがこの動作を管理するということを意味します。Oracle SOA Suiteでは、異なるリビジョンの別々のインスタンスに対して同じ対話IDを使用することに対する制限はありません。

相関セットを使用しない場合は、生成される対話IDはユーザーではなく、Oracle SOA Suiteによって決定されるため、生成される対話IDは一意になるので問題はありません。

Oracle SOA Suiteでは、コールバック・ルーティングでリビジョンのチェックは実行されません。コールバック・メッセージのルーティングは、次の情報にのみ基づきます。

  • 対話ID: これは、入力値と相関セットに基づいて計算されます。プロセスの2つのリビジョンに同じ相関セットを使用し、インスタンスの作成時に同じ入力値を入力した場合は、両方のリビジョンとも同じ対話IDを使用してサブスクライブされます。この場合、あるリビジョンに対するコールバックが別のリビジョンに配信される場合に混乱が発生します。

  • 操作名(両方のリビジョンで同じです)。

  • BPELサービス・コンポーネント名(これも、両方のリビジョンで同じです)。

リビジョン番号の概念は、Oracle SOAコンポジット・アプリケーションには適用可能ですが、BPEL仕様には含まれていません。このため、ルーティングを決定するための要素としては使用されません。

また、コールバックのルーティングの一部としてリビジョンを追加すると、別の問題を引き起こす原因となります。コールバックを送信する場合は、エンドポイントURLも指定します。エンドポイントURLにコンポジット・リビジョンが含まれていない場合(非常に可能性は高い)、メッセージのルーティング先はデフォルトのリビジョンであると判断されます。もしOracle SOA Suiteの実行時にコールバック・ルーティングの一部としてリビジョンのチェックを追加すると、デフォルト以外のリビジョンのインスタンスに対してはコールバックを送信できなくなります。

たとえば、次のBPELプロセスがあるとします。

  • receive_1という名前のreceiveアクティビティのエントリ(相関セットを使用)

  • Webサービスを起動するinvokeアクティビティ

  • receive_2という名前のreceiveアクティビティ

次の手順を実行すると仮定します。

  1. BPELコンポーネントが含まれているcomposite_Aのリビジョン1.0をデプロイします。

  2. 相関セットを使用しているリビジョン1.0のインスタンスを作成し、値に123と入力し、その結果conv_id = "123"が生成されます。

    このタイミングで、このプロセスは一方向のinvokeアクティビティを介してWebサービスを起動し、receive_2アクティビティでコールバックの着信を待機します。

  3. composite_Aのリビジョン2.0をデプロイし、その結果、2.0がデフォルトのリビジョンになります。

    Webサービスは、リビジョン1.0のインスタンスに対してコールバックを送信します。しかし、URLの中でリビジョン番号は指定されていません。通常、ユーザーは、URLにリビジョン番号を使用しないようにコールバックを作成しています。これは、Webサービスは外部のものであるため、継続的にリビジョン・タグを使用するようにWebサービスの設定を変更できないからです。なぜならば、リビジョン・タグはOracle SOA Suite内部の仕様で、外部では認識できない概念であるからです。

    リビジョン番号が指定されていないため、SOAサーバーではリビジョン番号が2.0であるとみなされるので、もしコールバックのルーティングにリビジョン番号を考慮した場合は、1.0が宛先であるこのコールバックを正しいリビジョンの1.0に転送できません。かわりに、2.0のデフォルトのリビジョンにルーティングしようとしますが、コールバックを待機している2.0のインスタンスは存在しません。

    ユーザーは、リビジョンに基づいてコールバック・メッセージをルーティングすることはできません。コールバック・メッセージのルーティングの基準に使用可能なオプションは、変換ID (相関セットを使用しない場合は、これも使用不可)、操作名およびコンポーネント名のみです。

    このような理由から、異なるインスタンスには別々の対話IDを使用して(つまり、変換IDの作成のための入力値には異なる値を使用して)混乱を回避し、ルーティングが対話IDのみに基づいて行われるようにする必要があります。

9.2.4 複数のパートを持つfromParts要素を使用したIMAの相関の設定に関する必知事項

次の使用例を考えてみます。

  • タイプが同じ複数のパートを持つWSDLメッセージ・タイプのBPEL 2.0プロセス

  • 前述のパートの要素タイプに基づいて定義されているプロパティ・エイリアス

各パートに対して定義されたfromPartsを持つfromParts要素を使用するインバウンド・メッセージ・アクティビティ(IMA) (receiveアクティビティ、scopeまたはpickアクティビティのonMessageブランチ、BPEL 2.0のscopeアクティビティのonEventブランチなど)を持つプロセスの場合、ランタイム環境でプロパティ・エイリアスが適用されるパートを判断できないため、相関を定義できません。

toParts要素およびfromParts要素を使用してWSDLメッセージ・パートをマッピングする方法の詳細は、「BPEL 2.0でのWSDLメッセージ・パートのマップ」を参照してください。

9.3 同じインスタンスへのメッセージのルーティング

Oracle BPEL Process Managerでは、メッセージ集約機能がサポートされています。複数のメッセージが同じプロセス/パートナ・リンク/操作名にルーティングされる場合、最初のメッセージは新規インスタンスを作成するためにルーティングされ、後続のメッセージは中間プロセスのreceiveアクティビティを使用して作成されたインスタンスを続行するためにルーティングできます。

メッセージ集約を使用すると、同じ操作(またはイベント名)をreceiveアクティビティのエントリおよび中間プロセスのreceiveアクティビティで使用できます。

注意:

  • この機能では集約のみが実行され、再順序付けは行われません。この機能は、正しくない順序で受信されるメッセージを適切な順序の形式になるよう再順序付けを行いません。したがって、最初のメッセージとは、単に処理された最初のメッセージを意味します。これは、時間順での最初のメッセージとは異なる場合があります。

  • メッセージ集約機能を活用するには、相関セットを使用する必要があります。

  • あいまいなコール(最初のreceiveアクティビティと中間プロセスのreceiveアクティビティの両方における)としての同期操作がサポートされています。ただし、これはこの機能の推奨される用途ではないため、使用しないようにしてください。

9.3.1 BPELプロセス・インスタンス作成の構成方法

reenableAggregationOnCompleteプロパティを使用して、メッセージをルーティングするために作成して使用するインスタンス数を制御できます。

BPELプロセス・インスタンス作成を構成する手順は、次のとおりです。

  1. SOAコンポジット・エディタで、図9-16に示すように、BPELプロセス・サービス・コンポーネントを選択します。

    図9-16 選択されたBPELプロセス・サービス・コンポーネント

    図9-16の説明が続きます
    「図9-16 選択されたBPELプロセス・サービス・コンポーネント」の説明
  2. Oracle JDeveloperの右下の隅にある「プロパティ・インスペクタ」に移動します。「プロパティ・インスペクタ」が表示されない場合は、「表示」メイン・メニューから「プロパティ・インスペクタ」を選択します。
  3. 図9-17に示すように、「プロパティ」セクションで「追加」アイコンをクリックします。

    図9-17 プロパティ・インスペクタ

    図9-17の説明が続きます
    「図9-17 プロパティ・インスペクタ」の説明

    「プロパティの作成」ダイアログが表示されます。

  4. 「名前」フィールドで、bpel.config.reenableAggregationOnCompleteデプロイメント・ディスクリプタのプロパティを入力します。このタイプのデプロイメント・ディスクリプタには、接頭辞bpel.configが必要です。
  5. 「値」フィールドで、表9-12の説明に従ってtrueと入力します。

    表9-12 reenableAggregationOnCompleteプロパティ設定

    説明

    true

    メッセージを処理する新規インスタンスが作成されます。ただし、メッセージの受信からインスタンスの完了までの間に、1つのウィンドウが表示されます。これにより、メッセージがDLV_MESSAGE表に残される場合があります。この設定により、競合状態が発生する場合があります。詳細は、表9-13を参照してください。

    initiate操作を使用して、クライアントに対してメッセージ1から4を起動します。これにより、次のアクションが発生します。

    • BPELプロセスの2つのインスタンスが作成されて完了されます。

    • メッセージ1と2は最初のインスタンスに、メッセージ3と4は2番目のインスタンスにルーティングされます。

    false

    これはデフォルトの動作です。この設定により、集約機能が無効化されます。作成されるインスタンスは1つのみです。インスタンスによって処理されないメッセージは、DLV_MESSAGE表に残されます。ほとんどの環境で、この設定を使用することをお薦めします。

    initiate操作を使用して、クライアントに対してメッセージ1から4を起動します。BPELプロセスの1つのインスタンスが作成されて完了されます。

    同じ相関セットを使用する複数のメッセージを1つのBPELインスタンスにルーティングしないようにしてください。


    図9-18は、完成した「プロパティの作成」ダイアログを示しています。

    図9-18 「プロパティの作成」ダイアログ

    図9-18の説明が続きます
    「図9-18 「プロパティの作成」ダイアログ」の説明
  6. 「OK」をクリックします。

    composite.xmlファイル内のbpel.config接頭辞が付いたreenableAggregationOnCompleteプロパティは、次のようになります。

    <composite name="Aggregation" revision="1.0" label="2011-07-10_13-52-24_174"
     mode="active" state="on">
    . . .
    . . .
    <component name="Aggregation" version="1.1">
        <implementation.bpel src="Aggregation.bpel"/>
          <property name="bpel.config.reenableAggregationOnComplete" type="xs:string"
                  many="false" override="may">true</property>
      </component>
    . . .
    . . .
    </composite>

9.3.2 receiveアクティビティのエントリと中間プロセスのreceiveアクティビティで同じ操作を使用する方法

次の例に示すように、相関セットを作成するとします。Oracle BPEL Process Managerに対するすべてのメッセージは、同じ操作名にルーティングされます。メッセージの相関IDは同じとなります。インタフェースWSDLでは、アクティビティのエントリ(receiveInput)と中間プロセスのreceiveアクティビティ(Continue_Receive)が区別されません。すべてのメッセージはinitiate操作を使用して処理されます。すべてのメッセージをルーティングするシングル・インスタンスが作成されます。

このことは、同じパートナ・リンクについて異なる操作名を定義する必要があった11g リリース1 11.1.1.6より前のリリースとは異なります。プロセスで2つの操作を公開する必要があり、コール元で適切な操作名を選択する必要がありました。

<receive name="receiveInput" partnerLink="client" portType="client:BPELProcess1"
 operation="initiate" variable="inputVariable" createInstance="yes">
 <correlations>
  <correlation initiate="yes" set="CorrelationSet_1"/>
 </correlations>
</receive>

<!-- Asynchronous callback to the requester. (Note: the callback location and
 correlation id is transparently handled using WS-addressing.) -->
<assign name="Assign_1">
 <copy>
  <from variable="inputVariable" part="payload"
 query="/client:BPELProcess1ProcessRequest/client:input"/>
  <to variable="Invoke_1_initiate_InputVariable" part="payload"
 query="/ns1:BPELProcess2ProcessRequest/ns1:input"/>
 </copy>
</assign>

<receive name="Continue_Receive" partnerLink="client"
 portType="client:BPELProcess1" operation="initiate" variable="inputVariable"
 createInstance="no">
 <correlations>
  <correlation initiate="no" set="CorrelationSet_1"/>
 </correlations>
</receive>

イベント配信ネットワーク(EDN)のビジネス・イベントの場合、receiveアクティビティのエントリと中間プロセスのreceiveアクティビティの両方で、operation属性をbpelx:eventNameに置換します。

bpelx:eventName="ns3:initiateEvent"/>

次の情報が、DLV_AGGREGATION表に保持されます。

  • 対話ID

  • ドメイン名

  • コンポーネント名とタイプ

  • コンポジット名、ラベルおよびリビジョン

  • 状態

  • 受信日

  • CIキー

  • 主キー

この情報は、パージ・スクリプトを使用してこの表から、またはOracle Enterprise Manager Fusion Middleware Controlの「自動パージ」ページから削除できます。これらのオプションの両方の詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』を参照してください。

9.3.3 相関セット使用時の新規インスタンスまたは既存インスタンスへのメッセージのルーティング方法

相関セットを使用したBPELプロセスでは、適切なルーティングが実行されます。メッセージは次のいずれかとなる可能性があります。

  • 新しいインスタンスを作成する起動メッセージ

  • 既存のインスタンスを続行するコールバック・メッセージ

図9-19に、同じ操作(process)を使用したreceiveアクティビティのエントリと中間プロセスのreceiveアクティビティを示します。

図9-19 新規インスタンスまたは既存インスタンスへの新規メッセージのルーティング

図9-19の説明が続きます
「図9-19 新規インスタンスまたは既存インスタンスへの新規メッセージのルーティング」の説明

次の例に、同じ操作(process)を使用したreceiveアクティビティのエントリと中間プロセスのreceiveアクティビティの例を示します。

<receive name="receiveInput" partnerLink="client" portType="client:BPELProcess1"
 operation="process" variable="inputVariable" createInstance="yes">
 <correlations>
  <correlation initiate="yes" set="CorrelationSet_1"/>
 </correlations>
</receive>

<!-- some business logic -->

<while name="While_1" condition=*loop for 3 iterations*>
 <sequence name="Sequence_1">
  <receive name="Continue_Receive" partnerLink="client"
 portType="client:BPELProcess1" operation="process" variable="inputVariable"
 createInstance="no">
   <correlations>
    <correlation initiate="no" set="CorrelationSet_1"/>
   </correlations>
  </receive>

<!-- some business logic -->

 </sequence>
</while>

前の例の初期のシナリオでは、次のアクションがBPELプロセスP1で発生します。

  • パートナによって、4つのメッセージ(メッセージ1、メッセージ2、メッセージ3およびメッセージ4)が同じパートナ(相関ID 101)に対して提供されます。

  • メッセージ1によって、BPELプロセスP1の新しいインスタンスが作成されます。このメッセージは起動メッセージとしてマークされます。

  • メッセージ2、3および4は、Continue_Receiveアクティビティを使用して受信されます。これらのメッセージはコールバック・メッセージとしてマークされます。

  • whileループが3回反復されることが想定されるため、インスタンスが閉じます。

ここで、追加メッセージがルーティングされ、これにより、競合状態が発生する可能性があると想定します。表9-13に詳細を示します。


表9-13 メッセージ配信シナリオ

シナリオ 説明 起動メッセージとしてマーク コールバック・メッセージとしてマーク

1

ここで、パートナによって、同じ相関ID (101)に対してメッセージ5が提供されると想定します。メッセージ5はBPELプロセスP1の新しいインスタンスを作成し、whileループ内のContinue_Receiveアクティビティで3つの追加メッセージ(6、7および8)を待機します。

  • メッセージ1

  • メッセージ5

  • メッセージ2

  • メッセージ3

  • メッセージ4

  • メッセージ6

  • メッセージ7

  • メッセージ8

2

メッセージ4と5が短い時間ウィンドウ内で受信される場合、メッセージ4によってインスタンスBPELプロセスP1が閉じ、メッセージ5がこのインスタンスへのコールバックとしてルーティングされる場合があります。このシナリオによって競合状態が発生する場合があります。次に例を示します。

  • メッセージ6が到着すると、新しいインスタンスのreceiveアクティビティのエントリにルーティングされます。

  • メッセージ7および8が、Continue_Receiveアクティビティにルーティングされます。

  • メッセージ5は、BPELプロセス・サービス・エンジンのリカバリ部分によってのみContinue_Receiveアクティビティにルーティングされます。これは、クローズされたインスタンスに最初にルーティングされ、処理できなかったためです。

  • メッセージ1

  • メッセージ6

  • メッセージ2

  • メッセージ3

  • メッセージ4

  • メッセージ5

  • メッセージ7

  • メッセージ8

3

これはシナリオ2に類似しています。ただし、この場合、メッセージ7、8および9は受信されません。次に例を示します。

  • メッセージ5は、サブスクライバを待機する、未処理のコールバック・メッセージとなります。

  • BPELプロセス・サービス・エンジンのリカバリにより、メッセージ5の処理が試行され、使用可能なサブスクライバが存在しないため失敗します。

メッセージ・リカバリにはいくつかのオプションがあります。

  • Oracle Enterprise Manager Fusion Middleware Controlの「システムMBeanブラウザ」プロパティmaxRecoverAttemptを使用したコールバック・メッセージのリカバリ制限。この数によって、起動メッセージやコールバック・メッセージをリカバリするための自動リカバリによる試行回数が指定されます。リカバリ試行回数がこの数を超えると、メッセージの状態は「消耗済」に変更されます。詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』の起動メッセージおよびコールバック・メッセージに対する自動リカバリ試行の構成に関する項を参照してください。

  • カスタムSQLスクリプトを記述して、criteriaCallbackstate0に設定されていることを確認します。このコールバックの相関値は、クローズされた状態(state = 0)でCORRELATION_GROUPに存在します。これは、コールバック・メッセージにクローズされた集約インスタンスのマークが付けられていることを示しています。ビジネス・ロジックに基づいて、これらのインスタンスの取消しやパージを行うことができます。

    注意: BPELは、対話ベースのシステムとして設計されています。未承諾メッセージが処理されていないときは、アプリケーションでは、相関集約の一部として常に受信メッセージを考慮し、ビジネス・ニーズに応じて、メッセージをサブスクライブして処理するか、または無視するかを選択します。

  • メッセージ1

  • メッセージ6

  • メッセージ2

  • メッセージ3

  • メッセージ4

  • メッセージ5