Webサービスは、同期または非同期の操作として起動できます。同期Webサービスは、問合せに対して即時レスポンスを提供し、操作中はBPELプロセスを遮断します。非同期Webサービスは、BPELプロセスを遮断しないため、サービスでのクライアント・リクエストの処理に時間を要する可能性がある環境に便利です。また、非同期サービスは、同期サービスより耐障害性に優れた拡張性のあるアーキテクチャを提供します。
同期および非同期のWebサービスには、次の要素が必要です。
パートナ・リンク: BPELプロセスが相互作用するWebサービスの場所と役割、およびWebサービスとBPELプロセス間で情報の受渡しに使用する変数を定義します。パートナ・リンクは、BPELプロセスがコールする各Webサービスに対して必要です。
invokeアクティビティ: BPELプロセス内でデータを送受信するためのポートをオープンします。BPELプロセスは、このポートを使用して必要なデータを送信し、レスポンスを戻します。同期Webサービスでは、関数の送受信に必要なポートは1つのみです。BPELプロセスがリプライを待機するため、明示的にリプライを受信する必要はありません。
非同期Webサービスには、次の要素も必要です。
receiveアクティビティ: Webサービスからのリプライを受信する別のポートを提供します。
相関ID: 戻されるレスポンスがそのリクエストに確実に対応するようにします。相関IDは、リクエストを開始したクライアントとパートナ・リンクに対して一意であり、Webサービスに送信されます。
SOA Order BookingアプリケーションのBPELプロセスには、(Rapid Manufacturerへの)同期Webサービスの起動と(Select Manufacturerへの)非同期Webサービスの起動が含まれています。
図7-5は、同期起動を示しています。invokeアクティビティ(InvokeRapidManufacturer)は、「RapidService」パートナ・リンクを使用して見積りを依頼します。Rapid Manufacturer Webサービス(図には表示されていません)は、問合せに対して即時にリプライします。
図7-6は、非同期起動を示しています。invokeアクティビティ(InvokeSelectManufacturer)は、「SelectService」パートナ・リンクを使用して見積りを依頼します。Select Manufacturer Webサービス(図には表示されていません)がリクエストを処理し、「ReceiveSelectManufacturer」アクティビティに対してリプライを戻します。このアクティビティは相関IDで追跡されます。
同期および非同期によるWebサービスの起動では、次のアクティビティをBPELプロセスに追加します。
BPELプロセスが相互作用する外部Webサービスを定義するためのpartner linkアクティビティ。
独自のローカル変数やフォルト・ハンドラが含まれる関連アクティビティをネストするためのscopeアクティビティ。
Webサービス(パートナ・リンクによって識別される)を起動する操作を指定するためのinvokeアクティビティ。
2つのassignアクティビティ。最初のassignアクティビティは、クライアントの問合せ入力を取得し、Webサービスと連絡を取ります。2番目のassignアクティビティは、Webサービスからのレスポンスを戻します。
非同期Webサービスの起動には、次のアクティビティも追加します。
invokeアクティビティの後のreceiveアクティビティ(図7-6を参照)。receiveアクティビティは、Webサービスからのデータを受信します。「Receive」ダイアログを使用して、WebサービスWSDLによって提供されるパートナ・リンク、操作および変数を選択します。
パートナ・リンクは、BPELプロセスが相互作用する外部サービスを定義します。
Webサービスに対するパートナ・リンクを作成する手順は、次のとおりです。
非同期BPELプロセスを作成します。
作成手順は、第7.2.1項「アプリケーションの作成方法」を参照してください。
「PartnerLink」アクティビティを「サービス」スイムレーンのいずれかにドラッグ・アンド・ドロップします。
図7-7に示すように、「パートナ・リンクの作成」ダイアログの「一般」タブを使用して、パートナ・リンクを作成するための値を入力します。
パートナ・リンクの名前を入力します。
「サービス・エクスプローラ」(懐中電灯アイコン)を使用して、WebサービスWSDLファイルのURLを参照します。
このWSDLにはWebサービスの通信エンドポイントが記述されています。
パートナ・リンク・タイプを選択します。
この値はWebサービスWSDLによって提供されます。
パートナ・ロールを選択します。
これはWebサービスのプロバイダ・ロールです。 この値はWebサービスWSDLによって提供されます。
同期Webサービスの起動では、「マイ・ロール」フィールドをスキップします。同期Webサービスに対するパートナ・リンクには、ロールは不要です。
図7-7に示すように、非同期Webサービスの起動では、「パートナ・リンクの作成」ダイアログの「マイ・ロール」フィールドに値を選択します。これはBPELプロセスのリクエスト側のロールです。この値は、WebサービスWSDLによって提供され、BPELプロセスにレスポンスを戻すためにSelect Manufacturer Webサービス(CallSelectManufacturer)が必要とする値です。
「OK」をクリックします。
ファイルを保存します。
scopeアクティビティは、1単位として処理するアクティビティのグループのコンテナです。
scopeアクティビティを作成する手順は、次のとおりです。
「receiveInput」アクティビティと「callbackClient」アクティビティ間に、「Scope」アクティビティをドラッグ・アンド・ドロップします。
「Scope」アクティビティをダブルクリックします。
「一般」タブを選択し、「Scope」アクティビティの名前を入力します。
「OK」をクリックします。
ファイルを保存します。
invokeアクティビティは、パートナ・リンクによって識別されたWebサービスに情報(通常はリクエスト)を送信し、そのWebサービスで実行する操作を指定します。
scopeアクティビティ内部にinvokeアクティビティを作成する手順は、次のとおりです。
作成した「Scope」アクティビティを開きます。
「Invoke」アクティビティを「Scope」アクティビティにドラッグ・アンド・ドロップします。
「Invoke」アイコンをダブルクリックします。
「Invoke」ダイアログを使用して、BPELプロセスとWebサービス間の最初の相互作用の操作を識別します。
「Invoke」アクティビティの名前を入力します。
以前に作成したパートナ・リンクを参照します。
操作を選択します。
この値はWebサービスWSDLによって提供されます。
「入力変数」フィールドの右側にある最初のアイコン(「変数自動作成」アイコン)を使用して入力変数を作成します。
invokeName_operationName_
InputVariable
という名前の変数が「入力変数」フィールドに自動的に作成されます。この変数には、メッセージ・タイプのWebServiceName
RequestMessage
が自動的に割り当てられます。 この値はWebサービスWSDLによって提供されます。この変数にはリクエストの内容が保持され、Webサービスに送信されます。
「出力変数」フィールドの右側にある最初のアイコンを使用して、出力変数を作成します。
invokeName_operationName_
OutputVariable
という名前の変数が「出力変数」フィールドに自動的に作成されます。この変数には、メッセージ・タイプのWebServiceName
ResponseMessage
が自動的に割り当てられます。 この値はWebサービスWSDLによって提供されます。この変数にはWebサービスからのリプライの内容が保持されます。
ファイルを保存します。
assignアクティビティは、変数、式およびその他の要素間のデータを転送します。
scopeアクティビティ内部に1つ目のassignアクティビティを作成する手順は、次のとおりです。
「Assign」アクティビティを「Scope」アクティビティ内の「Invoke」アクティビティの上にドラッグ・アンド・ドロップします。
「Assign」アイコンをダブルクリックします。
「Assign」ダイアログの「一般」タブを使用して、「Assign」アクティビティの名前を入力します。
「適用」をクリックします。
「コピー操作」タブをクリックします。
「作成」リストから「コピー操作」を選択します。
図7-8に示すように、「コピー操作の作成」ダイアログを使用して、特定の変数の内容を別の変数にコピーします。この「Assign」アクティビティは、クライアントの発注を入力として取得し、価格の見積りについてRapid Manufacturer Webサービスに連絡します。
「From」側の「変数」で、クライアントの入力変数名(BPELプロセスWSDLファイルに定義されている)が見つかるまでツリーを開きます。
「To」側の「変数」で、Webサービスが使用する入力変数名(WebサービスWSDLのメッセージ・タイプ定義に定義されている)が見つかるまでツリーを開きます。
「コピー操作の作成」ウィンドウと「Assign」ウィンドウを閉じます。
ファイルを保存します。
この2つ目のassignアクティビティは、クライアントの発注に対するレスポンスで価格の見積りを戻します。
scopeアクティビティ内部に2つ目のassignアクティビティを作成する手順は、次のとおりです。
2つ目の「Assign」アクティビティを「Scope」アクティビティ内の「Invoke」アクティビティの下にドラッグ・アンド・ドロップします。
「Assign」アイコンをダブルクリックします。
「Assign」ダイアログの「一般」タブを使用して、アクティビティの名前を入力します。
「適用」をクリックします。
「コピー操作」タブをクリックします。
「作成」リストから「コピー操作」を選択します。
「コピー操作の作成」ダイアログを使用して、特定の変数の内容を別の変数にコピーします。
「From」側の「変数」で、クライアントの出力変数名(BPELプロセスWSDLファイルに定義されている)が見つかるまでツリーを開きます。
「To」側の「変数」で、Webサービスが使用する出力変数名(WebサービスWSDLのメッセージ・タイプ定義に定義されている)が見つかるまでツリーを開きます。
「コピー操作の作成」ウィンドウと「Assign」ウィンドウを閉じます。
ファイルを保存します。
receiveアクティビティは、クライアントからのメッセージまたは非同期Webサービスからのコールバック・レスポンス・メッセージを待機します。
receiveアクティビティを作成する手順は、次のとおりです。
「Receive」アクティビティを「Invoke」アクティビティの下にドラッグ・アンド・ドロップします。
「Receive」アイコンをダブルクリックします。
図7-9に示すように、「一般」タブを使用してreceiveアクティビティの値を入力します。
「Receive」アクティビティの名前を入力します。
懐中電灯アイコンを使用して、Webサービスのパートナ・リンクを参照します。
この値はWebサービスWSDLによって提供されます。
操作を選択します。
この値はWebサービスWSDLによって提供されます。
懐中電灯アイコンを使用して、Webサービスからのレスポンスを保持する変数を参照します。
この値はWebサービスWSDLによって提供されます。
ファイルを保存します。
同期Webサービスの起動では、次のことが実行されます。
「receiveInput」 receiveアクティビティは、WSDLファイル(bpel_process_name.
wsdl
)の定義に従って、ユーザー(クライアント)からの入力を受信します。
1つ目のassignアクティビティは、Webサービスが受け取れるようにクライアントからのデータをパッケージ化します。
パートナ・リンクは、パッケージ化されたデータをWebサービスに送信し、レスポンスを受信します。
2つ目のassignアクティビティは、クライアント・アプリケーションが受け取れるように、レスポンスを「replyOutput」アクティビティに再パッケージ化します。
「replyOutput」アクティビティは、再パッケージ化されたレスポンスをクライアントに送信します。
例7-2に、同期Webサービスのパートナ・リンク定義とinvoke要素を示します。
例7-2 同期Webサービスのパートナ・リンク定義とinvoke要素のソース・コード
<!-- This section shows where the partner link is defined.--> <partnerLink name="RapidService" partnerRole="RapidQuote_Role" partnerLinkType="ns23:RapidQuote_PL"/> ... <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>
非同期Webサービスの起動では、次のことが実行されます。
assignアクティビティが発注を準備します。
invokeアクティビティ(InvokeSelectManufacturer)がリクエストを開始します。このリクエストの内容はリクエスト変数に入ります。リクエスト変数は非同期Webサービスに送信されます。
リクエストが開始されると、相関ID(リクエストを開始したクライアントとパートナ・リンクに一意)もWebサービスに送信されます。相関IDを使用することで、対応するリクエスタに正しいレスポンスが戻るようになります。
Webサービスは、相関IDによる追跡に従って、レスポンスをreceiveアクティビティ(ReceiveSelectManufacturer)に送信します。
assignアクティビティ(AssignSelectManufacturer)がレスポンスを読み込みます。
例7-3に、非同期Webサービスのパートナ・リンク定義とinvokeおよびreceive要素のソース・コードを示します。
例7-3 非同期Webサービスのパートナ・リンク定義とinvokeおよびreceive要素のソース・コード
<!-- This section shows where the partner link is defined.--> <partnerLink myRole="SelectServiceRequester" name="SelectService" partnerRole="SelectServiceProvider" partnerLinkType="ns17:SelectService_PL"/> ... <scope name="GetSelectMfrQuote"> <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>