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

前
次

16 マスター・プロセスと詳細プロセスの調整

この章では、BPELプロセスでのマスター・プロセスと詳細プロセスの調整について説明します。この調整により、マスターBPELプロセスとそれに関連した詳細BPELプロセスで実行されるタスクを指定できます。これは、親子関係とも呼ばれます。

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

16.1 マスター・プロセスと詳細プロセスの調整に関する概要

マスター・プロセスと詳細プロセスの調整は、単一のマスター・プロセスと複数の詳細プロセス間の1対多の関係で構成されます。

たとえば、ビジネス・プロセスで受注をアプリケーションにインポートするとします。各受注は、単一のヘッダー(顧客情報、配送先など)と複数の明細(品目名、品目番号、数量、価格など)で構成されます。

この受注の実行には、次の各タスクが実行されます。

  • ヘッダーを検証します。ヘッダーが無効な場合、処理は停止します。

  • 各明細を検証します。無効な明細がある場合は、無効としてマークされ、処理が停止します。

  • 各品目の在庫確認を実行します。品目が在庫にない場合は、作業指示が作成されて組み立てられます。

  • 各明細の品目が入手可能になった場合は、その品目を出荷ドックに移動します。

  • 注文品を顧客に発送します。

これらのタスクを実行するには、各ヘッダーの確認と検証を行う単一のマスター・プロセスと、各明細品目の確認と検証を行う複数のBPELプロセスを作成します。

考えられる調整のポイントは、次のとおりです。

  • マスター・プロセスは、ヘッダーの検証が正常に終了した後、処理を続行することを詳細プロセスに通知する必要があります。

  • 各詳細プロセスは、明細品目の検証を完了した場合、マスター・プロセスに通知する必要があります。

  • 各詳細プロセスは、明細品目が在庫で入手可能な場合、マスター・プロセスに通知する必要があります。

  • すべての明細品目が入手可能である場合、マスターは各詳細プロセスに通知して、明細品目を出荷ドックに移動する必要があります(入手可能になった明細品目をすべて移動した場合、ドックは一杯になる場合があります)。

  • すべての品目を移動した後、マスター・プロセスは、履行された注文品を顧客に発送するロジックを実行します。

図16-1は、1つのマスター・プロセスと2つの詳細プロセス間の、ヘッダーと明細品目の検証調整ポイントの概要を示しています。

図16-1 マスター・プロセスと詳細プロセスの調整の概要(1つのBPELプロセスから2つの詳細プロセスへ)

図16-1の説明が続きます
「図16-1 マスター・プロセスと詳細プロセスの調整の概要(1つのBPELプロセスから2つの詳細プロセスへ)」の説明

次のBPELプロセス・アクティビティは、マスター・プロセスと詳細プロセス間のアクションを調整します。

  • signal: 他のプロセス(マスターまたは詳細)に処理の続行を通知します。

  • receive signal: 他のプロセス(マスターまたは詳細)から適切な通知シグナルを受信するまで待機してから、処理を続行します。

どちらのアクティビティも、BPELプロセス・ファイルに定義されているラベル属性によって調整されます。ラベルはマスター・プロセス定義ごとに宣言されます。

図16-2は、BPELプロセス・フローの調整の概要を示しています。

図16-2 マスター・プロセスと詳細プロセスの構文の概要(1つのBPELプロセスから1つの詳細プロセスへ)

図16-2の説明が続きます
「図16-2 マスター・プロセスと詳細プロセスの構文の概要(1つのBPELプロセスから1つの詳細プロセスへ)」の説明

図16-2に示すように、各マスター・プロセスと詳細プロセスには、signalアクティビティとreceive signalアクティビティが含まれています。表16-1は、役割が定義されたプロセスのタイプに基づいて、アクティビティの役割について説明しています。


表16-1 マスター・プロセスと詳細プロセスの調整の役割

プロセス アクティビティ 結果

マスター・プロセス

signalアクティビティ

マスター・プロセスは実行時に、関連するすべての詳細プロセスに通知します。

詳細プロセス

receive signalアクティビティ

詳細プロセスは、マスター・プロセスが実行したシグナルを受信するまで待機します。

詳細プロセス

signalアクティビティ

詳細プロセスは実行時に、関連するマスター・プロセスに処理が完了したことを通知します。

マスター・プロセス

receive signalアクティビティ

マスター・プロセスは、すべての詳細プロセスが実行したシグナルを受信するまで待機します。


signalアクティビティがreceive signalアクティビティの前に実行された場合は、そのsignalアクティビティによって設定された状態が継続され、その状態は後のreceive signalアクティビティを読み取るまで有効です。

16.1.1 マスター・プロセスに対するBPELファイル定義

マスター・プロセスに対するBPELファイルは、詳細プロセスとの調整を定義します。BPELファイルは、マスター・プロセスが様々な詳細プロセスのパートナ・リンクと相互作用することを示します。次に例を示します。

<process name="MasterProcess"
. . .
. . .
  <partnerLinks>
    <partnerLink name="client"
             partnerLinkType="tns:MasterProcess"
             myRole="MasterProcessProvider"
             partnerRole="MasterProcessRequester"/>
    <partnerLink name="DetailProcess"
             partnerLinkType="dp:DetailProcess"
             myRole="DetailProcessRequester"
             partnerRole="DetailProcessProvider"/>
    <partnerLink name="DetailProcess1"
             partnerLinkType="dp1:DetailProcess1"
             myRole="DetailProcess1Requester"
             partnerRole="DetailProcess1Provider"/>
    <partnerLink name="DetailProcess2"
             partnerLinkType="dp2:DetailProcess2"
             myRole="DetailProcess2Requester"
             partnerRole="DetailProcess2Provider"/>
  </partnerLinks>

signalアクティビティは、このマスター・プロセスと調整するラベル値と詳細プロセスを示します。このラベル値(startDetailProcess)は、すべての詳細プロセスのreceive signalアクティビティのラベル値と一致しています。これにより、シグナルは適切なプロセスに送信されます。シグナル受信プロセスごとに1つのシグナル・プロセスがあります。マスター・プロセスは、実行時にすべての詳細プロセスに通知します。次の例のこの構文は、BPELバージョン2.0をサポートするBPELプロセスのsignalアクティビティを示しています。

<extensionActivity>
   <bpelx:signal name="notifyDetailProcess" 
                 label="startDetailProcess" to="details"/>
</extensionActivity>

注意:

BPEL 1.1では、signalアクティビティの構文は多少異なります。

<bpelx:signal name="notifyDetailProcess" label="startDetailProcess" to="details"/>

assign、invokeおよびreceiveの各アクティビティには、マスター・プロセスと詳細プロセス間の相互作用が記述されます。この例は、マスター・プロセスと詳細プロセスの1つ(DetailProcess)との間の相互作用を示しています。同様の相互作用は、すべての詳細プロセスについて、BPELファイルに定義されています。

invokeアクティビティで、「詳細として呼出し」チェック・ボックスが選択されていることを確認します。図16-3に詳細を示します。

図16-3 「詳細として呼出し」チェック・ボックス

図16-3の説明が続きます
「図16-3 「詳細として呼出し」チェック・ボックス」の説明

この選択は、詳細インスタンスとして、パートナ・プロセス・インスタンス(DetailProcess)を作成します。相互作用する各詳細プロセスに対するマスター・プロセスのinvokeアクティビティで、このチェック・ボックスを選択する必要があります。次の例に、「詳細として呼出し」チェック・ボックスを選択した後のBPELファイル・コンテンツの例を示します。

<assign>
   <copy>
     <from variable="input" part="payload" query="/tns:processInfo/tns:value"/>
     <to variable="detail_input" part="payload" query="/dp:input/dp:number"/>
   </copy>
</assign

<invoke name="receiveInput" partnerLink="DetailProcess"
        portType="dp:DetailProcess"
        operation="initiate" 
        inputVariable="detail_input" 
        bpelx:invokeAsDetail="true"/>

<!--  receive the result of the remote process -->
<receive name="receive_DetailProcess" partnerLink="DetailProcess"
            portType="dp:DetailProcessCallback"
            operation="onResult" variable="detail_output"/>

マスターBPELプロセスには、receive signalアクティビティが含まれています。このアクティビティは、すべての詳細プロセスからシグナルを受信するまでマスター・プロセスが待機することを示します。ラベル値(detailProcessComplete)は、各詳細プロセスのsignalアクティビティのラベル値と一致しています。これにより、シグナルは適切なプロセスに送信されます。次にコードの例を示します。次の構文は、BPELバージョン2.0をサポートするBPELプロセスのreceive signalアクティビティを示しています。

<extensionActivity>
   <bpelx:receiveSignal name="waitForNotifyFromDetailProcess" 
   label="detailProcessComplete" from="details"/>
</extensionActivity>

注意:

BPEL 1.1では、receive signalアクティビティの構文は多少異なります。

<bpelx:receiveSignal name="waitForNotifyFromDetailProcess" 
                     label="detailProcessComplete" 
                     from="details"/>

16.1.1.1 マスター・プロセスと複数の詳細プロセスの相関

1つのマスター・プロセスと複数の詳細プロセスがある環境では、シグナル相関にbpelx:detailLabel属性を使用します。次の例は、この属性の使用方法を示しています。

最初のinvokeアクティビティは、DetailProcess詳細プロセスを起動し、それをdetailProcessComplete0のラベルに関連付けます。

<invoke name="invokeDetailProcess" partnerLink="DetailProcess"
        portType="dp:DetailProcess"
        operation="initiate" 
        inputVariable="detail_input" 
        bpelx:detailLabel="detailProcessComplete0"
        bpelx:invokeAsDetail="true"/>

2番目のinvokeアクティビティは、DetailProcess1詳細プロセスを起動し、それをdetailProcessComplete1のラベルに関連付けます。次に例を示します。

<invoke name="invokeDetailProcess1" partnerLink="DetailProcess1"
        portType="dp1:DetailProcess1"
        operation="initiate" 
        inputVariable="detail_input1" 
        bpelx:detailLabel="detailProcessComplete1-2"
        bpelx:invokeAsDetail="true"/>

3番目のinvokeアクティビティは、異なるポートと異なる入力変数を使用してDetailProcess2詳細プロセスを再度起動します。これにより、次の例に示すように、DetailProcess2詳細プロセスがdetailProcessComplete1-2のラベルに関連付けられます。

<invoke name="invokeDetailProcess2" partnerLink="DetailProcess2"
        portType="dp2:DetailProcess2"
        operation="initiate" 
        inputVariable="detail_input2" 
        bpelx:detailLabel="detailProcessComplete1-2"
        bpelx:invokeAsDetail="true"/>

次の例に示すマスター・プロセスのreceive signalアクティビティは、詳細プロセスDetailProcess0からの返信シグナルを待機します。

<!-- This is a receiveSignal waiting for 1 child to signal back -->
<bpelx:receiveSignal name="waitForNotifyFromDetailProcess0"
label="detailProcessComplete0" from="details"/>

次の例に記載されているマスター・プロセスの2番目のreceive signalアクティビティも、DetailProcess1およびDetailProcess2からの返信シグナルを待機します。

<!-- This is a receiveSignal waiting for 2 child (detail) processes to signal back -->
<bpelx:receiveSignal name="waitForNotifyFromDetailProcess1-2"
   label="detailProcessComplete1-2" from="details"/>

注意:

BPELプロセスのreceive signalアクティビティが1つのみの場合、invokeアクティビティには、bpelx:detailLabel属性を指定しないでください。このような状況では、デフォルトのbpelx:detailLabel属性が適用されるため、指定する必要はありません。

16.1.2 詳細プロセスに対するBPELファイル定義

各詳細プロセスのBPELプロセス・ファイルには、マスター・プロセスとの調整を定義します。

receive signalアクティビティは、次の例に示す詳細プロセスが、マスター・プロセスが実行したシグナルを受信するまで待機することを示します。ラベル値(startDetailProcess)は、マスター・プロセスのsignalアクティビティのラベル値と一致しています。

<bpelx:receiveSignal name="waitForNotifyFromMasterProcess"
   label="startDetailProcess" from="master"/>

signalアクティビティは、次の例に示す詳細プロセスが、実行時に処理を完了したことを、関連するマスター・プロセスに通知することを示します。ラベル値(detailProcessComplete)は、各マスター・プロセスのreceive signalアクティビティのラベル値と一致しています。

<bpelx:signal name="notifyMAsterProcess" label="detailProcessComplete"
   to="master"/>

16.2 Oracle JDeveloperでのマスター・プロセスと詳細プロセスの調整の定義

この項では、Oracle BPELデザイナでのマスター・プロセスと詳細プロセスの調整の定義方法の概要を説明します。この例では、1つのマスター・プロセスと1つの詳細プロセスが定義されています。

注意:

この項では、マスター・プロセスと詳細プロセスの調整に固有のタスクについてのみ説明します。変数の作成、assignアクティビティの作成など、BPELプロセスで定義する標準のアクティビティについては説明しません

16.2.1 マスター・プロセスの作成方法

マスター・プロセスを作成する手順は、次のとおりです。

  1. で、BPELプロセス・サービス・コンポーネントを作成します。この例では、プロセスはMasterProcessという名前です。
  2. 「MasterProcess」BPELプロセスをダブルクリックします。
  3. 「コンポーネント」ウィンドウで、「Oracle Extensions」「シグナル」をクリックします。
  4. signalアクティビティをデザイナにドラッグします。
  5. signalアクティビティをクリックして、そのプロパティ・フィールドをプロパティ・インスペクタで表示するか、signalアクティビティをダブルクリックします。

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

    このアクティビティは、実行時に処理を実行する詳細プロセスに通知します。

  6. 表16-2に記載されている詳細を入力します。

    表16-2 「Signal」ダイアログのフィールドと値

    フィールド

    名前

    名前(この例では、contactDetailProcess)を入力します。

    ラベル

    ラベル名(この例では、beginDetailProcess)を入力します。このラベルは、ステップ6で詳細プロセスに設定したreceive signalアクティビティのラベルと一致している必要があります。

    To

    このシグナルを受信するプロセスのタイプとして、「詳細」を選択します。


    図16-4は、「Signal」ダイアログを示しています。

    図16-4 「Signal」ダイアログ

    図16-4の説明が続きます
    「図16-4 「Signal」ダイアログ」の説明
  7. 「OK」をクリックします。
  8. receive signalアクティビティをデザイナにドラッグします。
  9. receive signalアクティビティをダブルクリックします。

    このアクティビティにより、マスター・プロセスはすべての詳細プロセスが実行したシグナルを受信するまで待機できます。

  10. 表16-3に記載されている詳細を入力します。

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

    フィールド

    名前

    名前(この例では、waitForDetailProcess)を入力します。

    ラベル

    ラベル名(この例では、completeDetailProcess)を入力します。このラベルは、ステップ10で詳細プロセスに設定したsignalアクティビティのラベルと一致している必要があります。

    To

    シグナルを受信するプロセスのタイプとして、「詳細」を選択します。


    図16-5は、「Receive Signal」ダイアログを示しています。

    図16-5 「Receive Signal」ダイアログ

    図16-5の説明が続きます
    「図16-5 「Receive Signal」ダイアログ」の説明
  11. 「OK」をクリックします。

    これで、マスター・プロセスは次のことを実行するように設計されました。

    • 実行時に処理を実行する詳細プロセスに通知します。

    • 詳細プロセスが実行したシグナルを受信するまで待機します。

16.2.2 詳細プロセスの作成方法

詳細プロセスを作成する手順は、次のとおりです。

  1. で、2番目のBPELプロセス・サービス・コンポーネントを作成します。この例では、プロセスはDetailProcessという名前です。
  2. 「DetailProcess」BPELプロセスをダブルクリックします。
  3. 「コンポーネント」ウィンドウで、「Oracle Extensions」を展開します。
  4. receive signalアクティビティをBPELプロセス・サービス・コンポーネントにドラッグします。
  5. receive signalアクティビティをダブルクリックします。

    このアクティビティにより、詳細プロセスはマスター・プロセスが実行したシグナルを受信するまで待機できます。

  6. 表16-4に記載されている詳細を入力します。

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

    フィールド

    名前

    名前(この例ではWaitForContactFromMasterProcess)を入力します。

    ラベル

    ラベル名(この例では、beginDetailProcess)を入力します。このラベルは、ステップ6でマスター・プロセスに設定したsignalアクティビティのラベルと一致している必要があります。

    To

    シグナルを受信するプロセスのタイプとして「マスター」を選択します。


    図16-6は、「Receive Signal」ダイアログを示しています。

    図16-6 「Receive Signal」ダイアログ

    図16-6の説明が続きます
    「図16-6 「Receive Signal」ダイアログ」の説明
  7. 「OK」をクリックします。
  8. signalアクティビティをデザイナにドラッグします。
  9. signalアクティビティをダブルクリックします。

    このアクティビティにより、詳細プロセスは実行時に関連するマスター・プロセスに処理が完了したことを通知できます。

  10. 表16-5に記載されている詳細を入力します。

    表16-5 「Signal」ダイアログのフィールドと値

    フィールド

    名前

    名前(この例では、contactDetailProcess)を入力します。

    ラベル

    ラベル名(この例では、completeDetailProcess)を入力します。このラベルは、ステップ10でマスター・プロセスに設定したreceive signalアクティビティのラベルと一致している必要があります。

    To

    送信先として、「マスター」を選択します。


    図16-7は、「Signal」ダイアログを示しています。

    図16-7 「Signal」ダイアログ

    図16-7の説明が続きます
    「図16-7 「Signal」ダイアログ」の説明
  11. 「OK」をクリックします。

これで、詳細プロセスは次のこと実行するように設計されました。

  • マスター・プロセスが実行したシグナルを受信するまで待機します。

  • マスター・プロセスに実行時に処理が完了したことを通知します。

16.2.3 invokeアクティビティの作成方法

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

  1. 「MasterProcess」マスター・プロセスに戻ります。

  2. 「コンポーネント」ウィンドウで、「BPELコンストラクト」を展開します。

  3. invokeアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。

  4. invokeアクティビティをダブルクリックします。

  5. ステップ1で作成した「DetailProcess」BPELプロセスをパートナ・リンクとして選択します。

  6. 「詳細として呼出し」チェック・ボックスを選択します。

  7. 「Invoke」ダイアログの残りのすべてのフィールドを完成し、「OK」をクリックします。

  8. デザイナで、「ソース」をクリックします。BPELファイルは次のようになります。

    <invoke name="MyInvoke" partnerLink="DetailProcess"
       portType="dp:DetailProcess" 
       operation="initiate"
       inputVariable="detail_input"
       bpelx:invokeAsDetail name="true"/>
    

    この属性は、詳細インスタンスとしてパートナ・プロセス(DetailProcess)を作成します。

  9. 1つのマスター・プロセスが複数の詳細プロセスと相互作用する環境では、次のタスクを実行します。

    1. receive signalアクティビティと相関させるために、bpelx:detailLabel属性を指定します。

      <invoke name="MyInvoke" partnerLink="DetailProcess"
         portType="dp:DetailProcess" 
         operation="initiate"
         inputVariable="detail_input"/>
         bpelx:detailLabel="detailProcessComplete0"
         <bpelx:invokeAsdetail name="true"/>
      
    2. マスター・プロセスのreceive signalアクティビティのdetailProcessComplete0と同じラベル値を指定します。

      <bpelx:receiveSignal name="waitForNotifyFromDetailProcess0-1"
      label="detailProcessComplete0" from="details"/>
      
    3. 他の詳細プロセスについてもこれらの手順を必要に応じて繰り返し、必ず異なるラベル値を指定してください。

  10. 「ファイル」メイン・メニューから「すべて保存」を選択します。

    これで、マスターと詳細の調整設計が完成しました。