パラレル・フローを使用すると、BPELプロセスで複数のタスクを同時に実行できます。これは、時間を要する独立した複数のタスクを実行する必要がある場合に便利です。図7-20に、2つの異なるWebサービスからレスポンスを受け取るパラレル・フローを実行するBPELプロセスを示します。パラレル・フローには2つのシーケンスがあり、1つは同期Webサービス、もう1つは非同期Webサービスです。両方のシーケンスともinvokeアクティビティを使用してサービスを開始します。同期Webサービスでは、invokeアクティビティを使用してレスポンスを受信します。非同期Webサービスでは、receiveアクティビティを使用してコールバックを待機します。各レスポンスは異なるグローバル変数に格納されます。
同じデータを2つのWebサービスに送信するには、パラレル・フローを作成します。BPELプロセスは、同期または非同期のWebサービスからレスポンスを受け取る場合と同様に、レスポンスを受信します。
パラレル・フローを作成する手順は、次のとおりです。
開いた「Scope」アクティビティ内に、「Flow」アクティビティをドラッグ・アンド・ドロップします。
「Flow_1」アイコンをダブルクリックします。
「Flow」ダイアログを使用して、フローの名前を入力します。
フロー名は、「Flow」アクティビティが開いている場合は表示されません。「-」記号をクリックしてフロー名を表示します。
パラレル・フローを使用すると時間の効率化を促進できます。パラレル・フローを使用しない場合は、各コールバックで各サービスを1度に1つずつコールする必要があります。複数のコールをパラレル・フローに分割することで、BPELプロセスは、複数のWebサービスを1度に起動し、戻されたレスポンスを受信できます。
図7-21に、SOA Order Bookingアプリケーションの一部であるパラレル・フロー(CallManufacturers)を示します。このフローは、2社のサプライヤに価格見積りをパラレルで依頼します。「GetSelectMfrQuote」フローは「SelectService」Webサービスを起動し、「GetRapidMfrQuote」は「RapidService」Webサービスを起動します。(Webサービスはこの図には表示されていません。)
図7-22に、パラレル・フローの続きを示します。2つのプロセスはswitchアクティビティに合流します。このアクティビティでは、2つの見積りが比較され、低い金額の見積りが選択されます。
例7-9に、SOA Order Bookingアプリケーションの「CallManufacturers」パラレル・フローのソース・コードを示します。
例7-9 「CallManufacturers」パラレル・フローのソース・コード
<scope name="SelectSupplier">
<variables>
<variable name="selectManufacturerResponse"
messageType="ns17:RequestQuote_processRequestQuoteResponse"/>
<variable name="rapidManufacturerResponse"
messageType="ns23:RequestQuotePortType_POItemsQuoteResponse"/>
</variables>
<sequence>
<flow name="CallManufacturers">
<sequence name="Sequence_2">
<scope name="CallSelectManufacturer">
<variables>
<variable name="manufacturerRequest"
messageType="ns17:RequestQuote_processRequestQuote"/>
</variables>
<sequence name="Sequence_15">
<assign name="TransformSelectRequest">
<bpelx:annotation>
<bpelx:pattern>transformation</bpelx:pattern>
</bpelx:annotation>
<copy>
<from expression="ora:processXSLT('SelectTransformation.xsl',
bpws:getVariableData('inputVariable','payload'))"/>
<to variable="manufacturerRequest" part="parameters"/>
</copy>
</assign>
<invoke name="InvokeSelectManufacturer"
partnerLink="SelectService"
portType="ns17:SelectService"
operation="processRequestQuote"
inputVariable="manufacturerRequest"/>
<receive name="ReceiveSelectManufacturer" createInstance="no"
partnerLink="SelectService"
portType="ns17:SelectServiceCallback"
operation="processRequestQuoteResponse"
variable="selectManufacturerResponse"/>
</sequence>
</scope>
</sequence>
<sequence name="Sequence_1">
<scope name="CallRapidManufacturer">
<variables>
<variable name="manufacturerRequest"
messageType="ns23:RequestQuotePortType_POItemsQuote"/>
</variables>
<sequence name="Sequence_6">
<assign name="TransformRapidRequest">
<bpelx:annotation>
<bpelx:pattern>transformation</bpelx:pattern>
</bpelx:annotation>
<copy>
<from expression="ora:processXSLT('RapidTransformation.xsl',
bpws:getVariableData('inputVariable','payload'))"/>
<to variable="manufacturerRequest" part="parameters"/>
</copy>
</assign>
<invoke name="InvokeRapidManufacturer"
partnerLink="RapidService" portType="ns23:RequestQuote"
operation="POItemsQuote"
inputVariable="manufacturerRequest"
outputVariable="rapidManufacturerResponse"/>
</sequence>
</scope>
</sequence>
</flow>