この章の内容は次のとおりです。
Oracle JDeveloperでのマスター・プロセスと詳細プロセスの調整の定義
マスター・プロセスと詳細プロセスの調整は、単一のマスター・プロセスと複数の詳細プロセス間の1対多の関係で構成されます。
たとえば、ビジネス・プロセスで受注をアプリケーションにインポートするとします。各受注は、単一のヘッダー(顧客情報、配送先など)と複数の明細(品目名、品目番号、数量、価格など)で構成されます。
この受注の実行には、次の各タスクが実行されます。
ヘッダーを検証します。ヘッダーが無効な場合、処理は停止します。
各明細を検証します。無効な明細がある場合は、無効としてマークされ、処理が停止します。
各品目の在庫確認を実行します。品目が在庫にない場合は、作業指示が作成されて組み立てられます。
各明細の品目が入手可能になった場合は、その品目を出荷ドックに移動します。
注文品を顧客に発送します。
これらのタスクを実行するには、各ヘッダーの確認と検証を行う単一のマスター・プロセスと、各明細品目の確認と検証を行う複数のBPELプロセスを作成します。
考えられる調整のポイントは、次のとおりです。
マスター・プロセスは、ヘッダーの検証が正常に終了した後、処理を続行することを詳細プロセスに通知する必要があります。
各詳細プロセスは、明細品目の検証を完了した場合、マスター・プロセスに通知する必要があります。
各詳細プロセスは、明細品目が在庫で入手可能な場合、マスター・プロセスに通知する必要があります。
すべての明細品目が入手可能である場合、マスターは各詳細プロセスに通知して、明細品目を出荷ドックに移動する必要があります(入手可能になった明細品目をすべて移動した場合、ドックは一杯になる場合があります)。
すべての品目を移動した後、マスター・プロセスは、履行された注文品を顧客に発送するロジックを実行します。
図16-1は、1つのマスター・プロセスと2つの詳細プロセス間の、ヘッダーと明細品目の検証調整ポイントの概要を示しています。
図16-1 マスター・プロセスと詳細プロセスの調整の概要(1つのBPELプロセスから2つの詳細プロセスへ)
次のBPELプロセス・アクティビティは、マスター・プロセスと詳細プロセス間のアクションを調整します。
signal: 他のプロセス(マスターまたは詳細)に処理の続行を通知します。
receive signal: 他のプロセス(マスターまたは詳細)から適切な通知シグナルを受信するまで待機してから、処理を続行します。
どちらのアクティビティも、BPELプロセス・ファイルに定義されているラベル属性によって調整されます。ラベルはマスター・プロセス定義ごとに宣言されます。
図16-2 は、BPELプロセス・フローの調整の概要を示しています。
図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アクティビティを読み取るまで有効です。
マスター・プロセスに対する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に詳細を示します。
この選択は、詳細インスタンスとして、パートナ・プロセス・インスタンス(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"/>
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
属性が適用されるため、指定する必要はありません。
各詳細プロセスの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"/>
この項では、Oracle BPELデザイナでのマスター・プロセスと詳細プロセスの調整の定義方法の概要を説明します。この例では、1つのマスター・プロセスと1つの詳細プロセスが定義されています。
注意:
この項では、マスター・プロセスと詳細プロセスの調整に固有のタスクについてのみ説明します。変数の作成、assignアクティビティの作成など、BPELプロセスで定義する標準のアクティビティについては説明しません。
詳細プロセスを作成する手順は、次のとおりです。
これで、詳細プロセスは次のこと実行するように設計されました。
マスター・プロセスが実行したシグナルを受信するまで待機します。
マスター・プロセスに実行時に処理が完了したことを通知します。
invokeアクティビティを作成する手順は、次のとおりです。
「MasterProcess」マスター・プロセスに戻ります。
「コンポーネント」ウィンドウで、「BPELコンストラクト」を展開します。
invokeアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。
invokeアクティビティをダブルクリックします。
ステップ1で作成した「DetailProcess」BPELプロセスをパートナ・リンクとして選択します。
「詳細として呼出し」チェック・ボックスを選択します。
「Invoke」ダイアログの残りのすべてのフィールドを完成し、「OK」をクリックします。
デザイナで、「ソース」をクリックします。BPELファイルは次のようになります。
<invoke name="MyInvoke" partnerLink="DetailProcess" portType="dp:DetailProcess" operation="initiate" inputVariable="detail_input" bpelx:invokeAsDetail name="true"/>
この属性は、詳細インスタンスとしてパートナ・プロセス(DetailProcess
)を作成します。
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"/>
マスター・プロセスのreceive signalアクティビティのdetailProcessComplete0
と同じラベル値を指定します。
<bpelx:receiveSignal name="waitForNotifyFromDetailProcess0-1"
label="detailProcessComplete0" from="details"/>
他の詳細プロセスについてもこれらの手順を必要に応じて繰り返し、必ず異なるラベル値を指定してください。
「ファイル」メイン・メニューから「すべて保存」を選択します。
これで、マスターと詳細の調整設計が完成しました。