この章では、BPELプロセスでのマスター・プロセスと詳細プロセスの調整について説明します。この調整により、マスターBPELプロセスとそれに関連した詳細BPELプロセスで実行されるタスクを指定できます。これは、親子関係とも呼ばれます。
項目は次のとおりです。
マスター・プロセスと詳細プロセスの調整は、単一のマスター・プロセスと複数の詳細プロセス間の1対多の関係で構成されます。
たとえば、ビジネス・プロセスで受注をアプリケーションにインポートするとします。各受注は、単一のヘッダー(顧客情報、配送先など)と複数の明細(品目名、品目番号、数量、価格など)で構成されます。
この受注の実行には、次の各タスクが実行されます。
ヘッダーを検証します。ヘッダーが無効な場合、処理は停止します。
各明細を検証します。無効な明細がある場合は、無効としてマークされ、処理が停止します。
各品目の在庫確認を実行します。品目が在庫にない場合は、作業指示が作成されて組み立てられます。
各明細の品目が入手可能になった場合は、その品目を出荷ドックに移動します。
注文品を顧客に発送します。
これらのタスクを実行するには、各ヘッダーの確認と検証を行う単一のマスター・プロセスと、各明細品目の確認と検証を行う複数のBPELプロセスを作成します。
考えられる調整のポイントは、次のとおりです。
マスター・プロセスは、ヘッダーの検証が正常に終了した後、処理を続行することを詳細プロセスに通知する必要があります。
各詳細プロセスは、明細品目の検証を完了した場合、マスター・プロセスに通知する必要があります。
各詳細プロセスは、明細品目が在庫で入手可能な場合、マスター・プロセスに通知する必要があります。
すべての明細品目が入手可能である場合、マスターは各詳細プロセスに通知して、明細品目を出荷ドックに移動する必要があります(入手可能になった明細品目をすべて移動した場合、ドックは一杯になる場合があります)。
すべての品目を移動した後、マスター・プロセスは、履行された注文品を顧客に発送するロジックを実行します。
図15-1は、1つのマスター・プロセスと2つの詳細プロセス間の、ヘッダーと明細品目の検証調整ポイントの概要を示しています。
図15-1 マスター・プロセスと詳細プロセスの調整の概要(1つのBPELプロセスから2つの詳細プロセスへ)
次のBPELプロセス・アクティビティは、マスター・プロセスと詳細プロセス間のアクションを調整します。
signal: 他のプロセス(マスターまたは詳細)に処理の続行を通知します。
receive signal: 他のプロセス(マスターまたは詳細)から適切な通知シグナルを受信するまで待機してから、処理を続行します。
どちらのアクティビティも、BPELプロセス・ファイルに定義されているラベル属性によって調整されます。ラベルはマスター・プロセス定義ごとに宣言されます。
図15-2は、BPELプロセス・フローの調整の概要を示しています。
図15-2 マスター・プロセスと詳細プロセスの構文の概要(1つのBPELプロセスから1つの詳細プロセスへ)
図15-2に示すように、各マスター・プロセスと詳細プロセスには、signalアクティビティとreceive signalアクティビティが含まれています。表15-1は、役割が定義されたプロセスのタイプに基づいて、アクティビティの役割を説明しています。
表15-1 マスター・プロセスと詳細プロセスの調整の役割
プロセス | アクティビティ | 役割 |
---|---|---|
マスター・プロセス |
signalアクティビティ |
マスター・プロセスは実行時に、関連するすべての詳細プロセスに通知します。 |
詳細プロセス |
receive signalアクティビティ |
詳細プロセスは、マスター・プロセスが実行したシグナルを受信するまで待機します。 |
詳細プロセス |
signalアクティビティ |
詳細プロセスは実行時に、関連するマスター・プロセスに処理が完了したことを通知します。 |
マスター・プロセス |
receive signalアクティビティ |
マスター・プロセスは、すべての詳細プロセスが実行したシグナルを受信するまで待機します。 |
signalアクティビティがreceive signalアクティビティの前に実行された場合は、そのsignalアクティビティによって設定された状態が継続され、その状態は後のreceive signalアクティビティを読み取るまで有効です。
マスター・プロセスに対するBPELファイルは、詳細プロセスとの調整を定義します。BPELファイルは、マスター・プロセスが様々な詳細プロセスのパートナ・リンクと相互作用することを示します。例15-1に例を示します。
例15-1 マスター・プロセスに対する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バージョン1.1をサポートするBPELプロセスのsignalアクティビティを示しています。
<bpelx:signal name="notifyDetailProcess" label="startDetailProcess" to="details"/>
注意: BPEL 2.0では、signalアクティビティの構文は多少異なります。signalアクティビティはextensionActivity 要素にラップされます。
<extensionActivity> <bpelx:signal name="notifyDetailProcess" label="startDetailProcess" to="details"/> </extensionActivity> |
assign、invokeおよびreceiveの各アクティビティには、マスター・プロセスと詳細プロセス間の相互作用が記述されます。この例は、マスター・プロセスと詳細プロセスの1つ(DetailProcess
)との間の相互作用を示しています。同様の相互作用は、すべての詳細プロセスについて、BPELファイルに定義されています。
invokeアクティビティで、「詳細として呼出し」チェック・ボックスが選択されていることを確認します。図15-3に詳細を示します。
この選択は、詳細インスタンスとして、パートナ・プロセス・インスタンス(DetailProcess
)を作成します。相互作用する各詳細プロセスに対するマスター・プロセスのinvokeアクティビティで、このチェック・ボックスを選択する必要があります。例15-2に、「詳細として呼出し」チェック・ボックスを選択した後のBPELファイル・コンテンツの例を示します。
例15-2 bpelx:invokeAsDetail属性
<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アクティビティのラベル値と一致しています。これにより、シグナルは適切なプロセスに送信されます。例15-3に例を示します。次の構文は、BPELバージョン1.1をサポートするBPELプロセスのreceive signalアクティビティを示しています。
例15-3 receive signalアクティビティ
<bpelx:receiveSignal name="waitForNotifyFromDetailProcess"
label="detailProcessComplete"
from="details"/>
1つのマスター・プロセスと複数の詳細プロセスがある環境では、シグナル相関にbpelx:detailLabel
属性を使用します。例15-4は、この属性の使用方法を示しています。
最初のinvokeアクティビティは、DetailsProcess
詳細プロセスを起動し、それをdetailProcessComplete0
のラベルに関連付けます。
例15-4 最初のinvokeアクティビティ
<invoke name="invokeDetailProcess" partnerLink="DetailProcess" portType="dp:DetailProcess" operation="initiate" inputVariable="detail_input" bpelx:detailLabel="detailProcessComplete0" bpelx:invokeAsDetail="true"/>
2番目のinvokeアクティビティは、DetailsProcess1
詳細プロセスを起動し、それをdetailProcessComplete1
のラベルに関連付けます。例15-5に例を示します。
例15-5 2番目のinvokeアクティビティ
<invoke name="invokeDetailProcess1" partnerLink="DetailProcess1" portType="dp1:DetailProcess1" operation="initiate" inputVariable="detail_input1" bpelx:detailLabel="detailProcessComplete1-2" bpelx:invokeAsDetail="true"/>
3番目のinvokeアクティビティは、異なるポートと異なる入力変数を使用してDetailsProcess2
詳細プロセスを再度起動します。これにより、例15-6に示すように、DetailsProcess2
詳細プロセスがdetailProcessComplete1-2
のラベルに関連付けられます。
例15-6 3番目のinvokeアクティビティ
<invoke name="invokeDetailProcess2" partnerLink="DetailProcess2" portType="dp2:DetailProcess2" operation="initiate" inputVariable="detail_input2" bpelx:detailLabel="detailProcessComplete1-2" bpelx:invokeAsDetail="true"/>
例15-7に示すマスター・プロセスのreceive signalアクティビティは、詳細プロセスDetailProcess0
からの返信シグナルを待機します。
例15-7 receive signalアクティビティ
<!-- This is a receiveSignal waiting for 1 child to signal back -->
<bpelx:receiveSignal name="waitForNotifyFromDetailProcess0"
label="detailProcessComplete0" from="details"/>
例15-8に記載されているマスター・プロセスの2番目のreceive signalアクティビティも、DetailProcess1
およびDetailProcess2
からの返信シグナルを待機します。
例15-8 2番目のreceive signalアクティビティ
<!-- 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アクティビティは、例15-9に示す詳細プロセスが、マスター・プロセスが実行したシグナルを受信するまで待機することを示します。ラベル値(startDetailProcess
)は、マスター・プロセスのsignalアクティビティのラベル値と一致しています。
例15-9 startDetailProcessラベル値
<bpelx:receiveSignal name="waitForNotifyFromMasterProcess"
label="startDetailProcess" from="master"/>
signalアクティビティは、例15-10に示す詳細プロセスが、実行時に処理を完了したことを、関連するマスター・プロセスに通知することを示します。ラベル値(detailProcessComplete
)は、各マスター・プロセスのreceive signalアクティビティのラベル値と一致しています。
この項では、Oracle BPELデザイナでのマスター・プロセスと詳細プロセスの調整の定義方法の概要を説明します。この例では、1つのマスター・プロセスと1つの詳細プロセスが定義されています。
注意: この項では、マスター・プロセスと詳細プロセスの調整に固有のタスクについてのみ説明します。変数の作成、assignアクティビティの作成など、BPELプロセスで定義する標準のアクティビティについては説明しません。 |
マスター・プロセスを作成する手順は、次のとおりです。
SOAコンポジット・エディタで、BPELプロセス・サービス・コンポーネントを作成します。この例では、プロセスはMasterProcessという名前です。
「MasterProcess」BPELプロセスをダブルクリックします。
「コンポーネント・パレット」で、「Oracle Extensions」を展開します。
signalアクティビティをデザイナにドラッグします。
signalアクティビティをダブルクリックします。
このアクティビティは、実行時に処理を実行する詳細プロセスに通知します。
表15-2に記載されている詳細を入力します。
表15-2 「Signal」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
名前(この例では、 |
ラベル |
ラベル名(この例では、 |
To |
このシグナルを受信するプロセスのタイプとして、「詳細」を選択します。 |
図15-4は、「Signal」ダイアログを示しています。
「OK」をクリックします。
receive signalアクティビティをデザイナにドラッグします。
receive signalアクティビティをダブルクリックします。
このアクティビティにより、マスター・プロセスはすべての詳細プロセスが実行したシグナルを受信するまで待機できます。
表15-3に記載されている詳細を入力します。
表15-3 「Receive Signal」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
名前(この例では、 |
ラベル |
ラベル名(この例では、 |
To |
シグナルを受信するプロセスのタイプとして、「詳細」を選択します。 |
図15-5は、「Receive Signal」ダイアログを示しています。
「OK」をクリックします。
これで、マスター・プロセスは次のことを実行するように設計されました。
実行時に処理を実行する詳細プロセスに通知します。
詳細プロセスが実行したシグナルを受信するまで待機します。
詳細プロセスを作成する手順は、次のとおりです。
SOAコンポジット・エディタで、2番目のBPELプロセス・サービス・コンポーネントを作成します。この例では、プロセスはDetailProcessという名前です。
「DetailProcess」BPELプロセスをダブルクリックします。
「コンポーネント・パレット」で、「Oracle Extensions」を展開します。
receive signalアクティビティをBPELプロセス・サービス・コンポーネンントにドラッグします。
receive signalアクティビティをダブルクリックします。
このアクティビティにより、詳細プロセスはマスター・プロセスが実行したシグナルを受信するまで待機できます。
表15-4に記載されている詳細を入力します。
表15-4 「Receive Signal」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
名前(この例では |
ラベル |
ラベル名(この例では、 |
To |
シグナルを受信するプロセスのタイプとして「マスター」を選択します。 |
図15-6は、「Receive Signal」ダイアログを示しています。
「OK」をクリックします。
signalアクティビティをデザイナにドラッグします。
signalアクティビティをダブルクリックします。
このアクティビティにより、詳細プロセスは実行時に関連するマスター・プロセスに処理が完了したことを通知できます。
表15-5に記載されている詳細を入力します。
表15-5 「Signal」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
名前(この例では |
ラベル |
ラベル名(この例では、 |
To |
送信先として、「マスター」を選択します。 |
図15-7は、「Signal」ダイアログを示しています。
「OK」をクリックします。
これで、詳細プロセスは次のこと実行するように設計されました。
マスター・プロセスが実行したシグナルを受信するまで待機します。
マスター・プロセスに実行時に処理が完了したことを通知します。
invokeアクティビティを作成する手順は、次のとおりです。
「MasterProcess」マスター・プロセスに戻ります。
「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。
invokeアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。
invokeアクティビティをダブルクリックします。
ステップ1で作成した「DetailProcess」BPELプロセスをパートナ・リンクとして選択します。
「Invoke」ダイアログの残りのすべてのフィールドを完成し、「OK」をクリックします。
デザイナで、「ソース」をクリックします。
invokeアクティビティの「詳細として呼出し」チェック・ボックスを選択します。例15-11に示すようなBPELファイルが表示されます。
例15-11 bpelx:invokeAsdetail属性
<invoke name="MyInvoke" partnerLink="DetailProcess" portType="dp:DetailProcess" operation="initiate" inputVariable="detail_input" bpelx:invokeAsDetail name="true"/>
この属性は、詳細インスタンスとしてパートナ・プロセス(DetailProcess
)を作成します。
1つのマスター・プロセスが複数の詳細プロセスと相互作用する環境では、次のタスクを実行します。
「ファイル」メイン・メニューから「すべて保存」を選択します。
これで、マスターと詳細の調整設計が完成しました。