この章では、非同期Webサービスのコール方法について説明します。非同期メッセージ形式は、サービス(融資処理など)でクライアント・リクエストの処理に時間がかかる環境で役に立ちます。また、非同期サービスは、同期サービスよりも優れた耐障害性を持ち、かつスケーラブルなアーキテクチャも提供します。
項目は次のとおりです。
この項では、United Loanという企業での非同期Webサービスの起動について説明します。United Loanは、クライアントの融資申請リクエストを処理して融資提案を返す非同期Webサービスを公開します。このユースケースでは、BPELプロセス・サービス・コンポーネントとこの非同期融資申請承認Webサービスを統合する方法について説明します。
このユースケースでは、非同期サービスからの情報をリクエストし、レスポンスを受け取るための基本的な設計概念について説明します。この例のUnited Loanの非同期サービスは、別のBPELプロセス・サービス・コンポーネントです。しかし、適切に設計されたWebサービスであれば、同じBPELコールで対話できます。対象のWebサービスのWSDLファイルには、必要な情報のリクエストと受信に必要な情報が含まれています。
非同期Webサービスでは、次のアクションが(優先度に従って)実行されます。
assignアクティビティにより融資申請が準備されます。
invokeアクティビティにより融資申請が開始されます。申請の内容は、リクエスト変数に入力されます。このリクエスト変数が非同期融資処理Webサービスに送信されます。
融資申請の開始時、申請を開始したクライアントとパートナ・リンクに固有の相関IDも、融資処理Webサービスに送信されます。相関IDにより、適切な融資提案レスポンスが、対応する融資申請のリクエスト元に確実に返されます。
その後、融資処理Webサービスにより、適切なレスポンスがreceiveアクティビティ(相関IDを使用して追跡)に送信されます。
assignアクティビティにより融資申請提案が読み取られます。
後続の各項では、非同期機能の詳細を説明します。
この項では、非同期機能をBPELプロセス・サービス・コンポーネントに追加するためのタスクの概要を説明します。
次の手順を実行し、Webサービスを非同期で起動します。
パートナ・リンクの追加
invokeアクティビティの追加
receiveアクティビティの追加
assignアクティビティの作成
ここでは、融資申請承認Webサービスに対するパートナ・リンク(この例ではLoanServiceという名前)をBPELプロセスに作成する方法について説明します。
非同期サービスに対してパートナ・リンクを追加する手順は、次のとおりです。
SOAコンポジット・エディタで、BPELプロセスを「コンポーネント・パレット」の「サービス・コンポーネント」セクションからデザイナにドラッグします。
「BPELプロセスの作成」ダイアログが表示されます。
ダイアログの説明に従って、BPELプロセス・サービス・コンポーネントを作成します。
完了後に「OK」をクリックします。
SOAコンポジット・エディタのSOAコンポジット・アプリケーションで、BPELプロセス・サービス・コンポーネント(この例では、LoanBrokerというコンポーネント名)をダブルクリックします。
Oracle BPELデザイナが表示されます。
「コンポーネント・パレット」で「BPELサービス」を展開します。
パートナ・リンク(Webサービス/アダプタ)を右側の「パートナ・リンク」スイムレーンにドラッグします。
「パートナ・リンクの作成」ダイアログが表示されます。
次の詳細を入力して、パートナ・リンクを作成し、融資申請承認Webサービスを選択します。
名前
パートナ・リンクの名前を入力します(この例ではLoanService
を入力します)。
プロセス
BPELプロセス・サービス・コンポーネント名が表示されます(この例ではLoanBroker
が表示されます)。
WSDL URL
使用するWeb Services Description Language(WSDL)ファイルを入力します。このフィールドの上にある「SOAリソース・ルックアップ」アイコンをクリックして、正しいWSDLを検索します。
パートナ・リンク・タイプ
BPELプロセス・サービス・コンポーネントのインタフェース先である外部サービスを指します。リストから選択します(この例ではLoanService
を選択します)。
パートナ・ロール
外部ソースのロールです(プロバイダなど)。リストから選択します(この例ではLoanServiceProvider
を選択します)。
マイ・ロール
この相互作用におけるBPELプロセス・サービス・コンポーネントのロールです。リストから選択します(この例ではLoanServiceRequester
を選択します)。
「OK」をクリックします。
融資申請承認Webサービス(United Loan)の新しいパートナ・リンクがデザイナのスイムレーンに表示されます。
次の手順に従って、invokeアクティビティとrequest
という名前のグローバル入力変数を作成します。このアクティビティは、融資申請承認Webサービス(United Loan)を使用して、非同期BPELプロセス・サービス・コンポーネント・アクティビティを開始します。融資申請承認Webサービスは、request
入力変数を使用してクライアントからの融資申請を受け取ります。
invokeアクティビティを追加する手順は、次のとおりです。
「コンポーネント・パレット」で、「BPELアクティビティとコンポーネント」を開きます。
「コンポーネント・パレット」からinvokeアクティビティをreceiveアクティビティの下にドラッグします。
「構造」ウィンドウに移動します。この例では、「構造」ウィンドウから変数を作成する手順を説明しますが、「Invoke」ダイアログの「入力」フィールドと「出力」フィールドの右側にある「追加」アイコンをクリックして変数を作成することもできます。
「変数」を右クリックし、「すべての子ノードを開く」を選択します。
ツリーの2つ目の「変数」フォルダで右クリックし、「変数の作成」を選択します。
「変数の作成」ダイアログが表示されます。
変数名を入力し、表示されたオプションから「メッセージ・タイプ」を選択します。
単純型
このオプションでは、XMLスキーマの単純型(文字型やブール型など)を選択できます。
メッセージ・タイプ
このオプションでは、パートナ・リンクまたは現在のBPELプロセス・サービス・コンポーネントのプロジェクトWSDLファイルに対するWSDLメッセージ・ファイル定義を選択できます(レスポンス・メッセージやリクエスト・メッセージなど)。メッセージ・タイプと関連付けられている変数をinvoke、receiveまたはreplyアクティビティの入力変数または出力変数として指定できます。
メッセージ・タイプを表示するには、「メッセージ・タイプ」オプションを選択し、「参照」アイコンを選択して「タイプ・チューザ」ダイアログを表示します。ここから選択するために「メッセージ・タイプ」ツリーを開きます。この例では、「メッセージ・タイプ」→「パートナ・リンク」→「Loan Service」→「LoanService.wsdl」→「メッセージ・タイプ」→「LoanServiceRequestMessage」を順に選択します。
要素
このオプションでは、現在のBPELプロセス・サービス・コンポーネントのプロジェクト・スキーマ・ファイルまたはプロジェクトWSDLファイルのXMLスキーマ要素、またはパートナ・リンクのXMLスキーマ要素を選択できます。
図8-1に、「変数の作成」ダイアログを示します。
「OK」をクリックします。
invokeアクティビティをダブルクリックし、「Invoke」ダイアログを表示します。
「Invoke」ダイアログで、「パートナ・リンク」リストからパートナ・リンク(この例では「LoanService」)を選択し、「操作」リストから「initiate」を選択します。
「入力変数」フィールドの右で、2番目のアイコンをクリックし、手順6で作成した入力変数を選択します。
「変数チューザ」ダイアログが表示され、変数の選択が可能になります。
出力変数はreceive操作で返されるため、指定していません。invokeアクティビティが作成されました。
invokeアクティビティの詳細は、第8.2.2.5項「invokeアクティビティとreceiveアクティビティ」を参照してください。
「OK」をクリックします。
次の手順に従って、receiveアクティビティとresponse
という名前のグローバル出力変数を作成します。このアクティビティは、融資申請承認Webサービスのコールバック処理を待機します。融資申請承認Webサービスは、この出力変数を使用して、融資提案結果をクライアントに送信します。
receiveアクティビティを追加する手順は、次のとおりです。
「コンポーネント・パレット」から、receiveアクティビティを、第8.2.1.2項「invokeアクティビティの追加」で作成したinvokeアクティビティの直後にドラッグします。
前の手順3〜7と同様の手順で、「変数の作成」ダイアログを開き、受信情報を格納する変数を作成します。
図8-2に、「変数の作成」ダイアログを示します。
receive
アクティビティをダブルクリックし、名前をreceive_invokeに変更します。
「パートナ・リンク」リストからパートナ・リンクを選択します(この例では「LoanService」を選択します)。
「操作」リストから「onResult」を選択します。「インスタンスの作成」チェック・ボックスは選択しないでください。
「OK」をクリックします。
receiveアクティビティと出力変数が作成されます。BPELファイル(この例ではLoanBroker.bpel)の最初のreceiveアクティビティが最初のBPELプロセス・インスタンス・サービス・コンポーネント・インスタンスを作成したため、2つ目のインスタンスを作成する必要はありません。
この項では、非同期Webサービス起動時の処理内容について説明します。
WSDLファイル(この例ではLoanService
)のportType
セクションは、非同期サービスに使用するポートを定義します。
非同期サービスにはポート・タイプが2つ定義されます。各ポート・タイプは一方向操作を実行します。この例では、1つのポート・タイプが非同期プロセスに応答し、もう1つのポート・タイプが非同期レスポンスを使用してクライアントをコールバックします。例8-1では、portType
LoanServiceCallback
がクライアントの融資申請リクエストを受け取り、portType
LoanService
が融資提案レスポンスを使用してクライアントを非同期でコールバックします。
例8-1 portType定義
<!-- portType implemented by the LoanService BPEL process --> <portType name="LoanService"> <operation name="initiate"> <input message="tns:LoanServiceRequestMessage"/> </operation> </portType> <!-- portType implemented by the requester of LoanService BPEL process for asynchronous callback purposes --> <portType name="LoanServiceCallback"> <operation name="onResult"> <input message="tns:LoanServiceResultMessage"/> </operation> </portType>
WSDLファイル(この例ではLoanService
)のpartnerLinkType
セクションは、BPELプロセス・サービス・コンポーネントの次の特性を定義します。
果たすロール(操作)
対話でメッセージを受信するために提供するportType
非同期サービスのパートナ・リンク・タイプには、Webサービス・プロバイダに対するロールとクライアント・リクエスタに対するロールの2つのロールがあります。
例8-2では、LoanServiceProvider
ロールおよびLoanService
portType
は、クライアント・リクエスト・メッセージに使用され、LoanServiceRequester
ロールおよびLoanServiceCallback
portType
は、レスポンス・メッセージをクライアントに非同期で返す(コールバックする)ために使用されます。
例8-2 partnerLinkType定義
<plnk:partnerLinkType name="LoanService"> <plnk:role name="LoanServiceProvider"> <plnk:portType name="client:LoanService"/> </plnk:role> <plnk:role name="LoanServiceRequester"> <plnk:portType name="client:LoanServiceCallback"/> </plnk:role> </plnk:partnerLinkType>
2つのポート・タイプ(invoke
アクティビティのportType="services:LoanService"
とreceive
アクティビティのportType="services:LoanServiceCallback"
)は、この1つの非同期BPELプロセス・サービス・コンポーネントに結合されます。基本的に、ポート・タイプは実行される一連の操作です。このBPELプロセス・サービス・コンポーネントの場合、実行する操作は2つ(invoke
アクティビティのinitiate
とreceive
アクティビティのonResult
)あります。
サービスをBPELからコールするには、プロセスとWebサービスの連携方法をBPELファイルで定義する必要があります。partnerLinks
セクションを表示します。プロセスが相互作用するサービスはパートナ・リンクとして設計されます。各パートナ・リンクは、partnerLinkType
によって定義されます。
各パートナ・リンクには名前が付けられています。この名前は、そのパートナ・リンクによるすべてのサービス相互作用に使用されます。これは、レスポンスを、同じタイプの同時リクエストに対する異なるパートナ・リンクに相関する場合に重要です。
非同期プロセスは、クライアントへのコールバックに2番目のパートナ・リンクを使用します。この例では、2番目のパートナ・リンクLoanService
が融資申請承認Webサービスによって使用されます。例8-3に例を示します。
例8-3 partnerLink定義
<!-- This process invokes the asynchronous LoanService. --> <partnerLink name="LoanService" partnerLinkType="services:LoanService" myRole="LoanServiceRequester" partnerRole="LoanServiceProvider"/> </partnerLinks>
属性myRole
は、クライアントのロールを示します。属性partnerRole
は、この対話におけるパートナのロールを示します。非同期プロセスでは、各partnerLinkType
にmyRole
属性とpartnerRole
属性があります。
composite.xml
ファイルには、例8-4に示すように、融資申請承認Webサービスが表示されます。
例8-4 融資申請承認Webサービス
<component name="LoanBroker"> <implementation.bpel process="LoanBroker.bpel"/> </component>
パートナ・リンクの作成手順の詳細は、第8.2.1.1項「非同期サービスに対するパートナ・リンクの追加」を参照してください。
variables
およびsequence
セクションを表示します。ここでは特に、invoke
アクティビティとreceive
アクティビティの2つの領域に注目します。
invoke
アクティビティは、同期Webサービスを起動(第7章「BPELプロセスからの同期Webサービスの起動」を参照)するか、または非同期サービスを開始します。
invoke
アクティビティにはvariable
セクションで定義されたrequest
グローバル入力変数が含まれます。request
グローバル入力変数は融資申請承認Webサービスで使用されます。この変数には、最初の融資申込書の内容が格納されます。
融資申請承認Webサービスからの非同期コールバックを待機するreceive
アクティビティ。receive
アクティビティにはvariables
セクションで定義されたresponse
グローバル出力変数が含まれます。この変数には、融資提案レスポンスが格納されます。receive
アクティビティは、サービスからのコールバック・メッセージを非同期に待機します。BPELプロセス・サービス・コンポーネントは、コールバック・メッセージの到着を待機中、デハイドレーション(圧縮して格納)されます。
例8-5に例を示します。
例8-5 invokeアクティビティとreceiveアクティビティ
<variables> <variable name="request" messageType="services:LoanServiceRequestMessage"/> <variable name="response" messageType="services:LoanServiceResultMessage"/> </variables> <sequence> <!-- initialize the input of LoanService --> <assign> <!-- initiate the remote process --> <invoke name="invoke" partnerLink="LoanService" portType="services:LoanService" operation="initiate" inputVariable="request"/> <!-- receive the result of the remote process --> <receive name="receive_invoke" partnerLink="LoanService" portType="services:LoanServiceCallback" operation="onResult" variable="response"/>
invoke
アクティビティによって非同期サービスが開始されると、Web Services Addressing(WS-Addressing)(第8.4項「非同期サービスでのWS-Addressingの使用」で説明)を使用して、クライアント・リクエストに固有の相関IDが送信されます。複数のプロセスがサービス・コールバックを待機している可能性があるため、サーバーでは、どのBPELプロセス・サービス・コンポーネント・インスタンスが融資申請承認Webサービスからのコールバック・メッセージを待機しているかを把握する必要があります。相関IDによって、サーバーは、レスポンスを適切なリクエスト・インスタンスと関係付けることができます。
最初のreceive
アクティビティには、createInstance
属性があります。この最初のreceive
アクティビティでは、createInstance
要素はyes
に設定されています。これにより、新しいBPELプロセス・サービス・コンポーネント・インスタンスが起動されます。対話のためには、少なくとも1つのインスタンスが起動している必要があります。このため、2番目のreceive
アクティビティではcreateInstance
変数をno
に設定します。
例8-6に、createInstance
属性のソース・コードを示します。
非同期コールバックの待機中、長期間にわたる非同期プロセスとその現在の状態の情報をデータベース内に自動的に保存するには、データベースをデハイドレーション・ストアとして使用します。データベースにプロセスを格納することにより、プロセスを維持し、システムの停止やネットワークの問題が発生した場合の状態や信頼性の低下を防ぎます。この機能により、BPELプロセス・サービス・コンポーネントの信頼性とスケーラビリティの両方が向上します。また、クラスタリングおよびフェイルオーバーのサポートにもこの機能を使用できます。
このポイントは、invokeアクティビティとreceiveアクティビティの間に挿入します。
Oracle SOA Suiteでは、パートナ・リンクの複数のエンドポイント・ロケーションの指定がサポートされています。この機能は、最初のエンドポイントが停止した場合に、フェイルオーバーするのに便利です。パートナ・リンクの代替エンドポイント・ロケーションを提供するには、composite.xml
ファイルにlocation
属性を追加します。例8-7に例を示します。
例8-7 代替のランタイム・エンドポイント・ロケーション
<reference name="HeaderService ...> <binding.ws port="http://services.otn.com/HelloWorldApp#wsdl.endpoint(client/ HelloWorldService_pt)" location="http://server:port/soa-infra/services/default/ HelloWorldService!1.0/client?WSDL"> <property name="endpointURI">http://jsmith.us.oracle.com:80/a.jsp @http://myhost.us.oracle.com:8888/soa-infra/services/HelloWorldApp/HelloWorld! 1.0*2007-10-22_14-33-04_195/client </property> </binding.ws> </reference>
パートナ・リンクは、実行時にBPELで動的に構成できます。これは、BPELが起動するターゲット・サービスが実行するまでわからない場合に便利です。
同じportType
を使用する複数のサービスが含まれているWSDLファイルを作成します。
WSDLを使用するcomposite.xml
ファイルに、参照バインディング・コンポーネントのエントリを作成します。
<reference name="loanService">
<interface.wsdl interface="http://services.otn.com#wsdl.interface(LoanService)"
callbackInterface="http://services.otn.com#wsdl.interface(LoanServiceCallback)"
/>
<binding.ws port=
"http://services.otn.com#wsdl.endpoint(AmericanLoan/LoanService_pt)"/>
</reference>
注意:
|
BPELファイルで、パートナ・リンクをプログラムで割り当てます。この例のUnitedLoan
は、WSDLに定義されているサービスの1つです。
<copy> <from> <EndpointReference xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing"> <Address>http://myhost.us.oracle.com:9700/orabpel/default/UnitedLoan</Address> </EndpointReference> </from> <to partnerLink="LoanService"/> </copy>
ある時点でアクティブなインスタンスは多数存在する可能性があるため、サーバーはWebサービス・レスポンスに、対応する適切なBPELプロセス・サービス・コンポーネント・インスタンスを指示する必要があります。WS-Addressingを使用すると、非同期メッセージを識別して、非同期コールバックが確実に適切なクライアントを特定できるようにすることができます。
図8-3に、WS-Addressingの概要を示します。WS-Addressingは、非同期メッセージの相関にSimple Object Access Protocol(SOAP)ヘッダーを使用します。メッセージは、使用されるトランスポートまたはアプリケーションに依存しません。
図8-3は、レスポンスが正しい宛先に送信されるように、メッセージがWSヘッダーとともに渡される様子を示しています。
この章の例では、相関にWS-Addressingを使用しています。メッセージの表示には、TCPトンネリングを使用できます。TCPトンネリングについては、第8.4.1.1項「プログラム間で交換されるメッセージのTCPトンネリングによる表示」で説明します。
WS-Addressingは、通常は通信プロトコルおよびメッセージ・システムで提供される次の情報を定義します。この情報は、トランスポートまたはアプリケーションに依存せずに処理されます。
エンドポイント・ロケーション(返信先アドレス)
返信先アドレスは、BPELクライアントがコールバック・メッセージをリスニングする場所を指定します。
対話ID
TCPトンネリングを使用して、BPELプロセス・サービス・コンポーネント・フローとWebサービスの間で交換されたSOAPメッセージ(相関IDを含むメッセージなど)を表示します。BPELプロセス・サービス・コンポーネント・フローの通信先のサービスに対して送受信される正確なSOAPメッセージを確認できます。
BPELプロセス・サービス・コンポーネント・フローとWebサービスの間にソフトウェア・リスナーを挿入します。BPELプロセス・サービス・コンポーネント・フローはリスナー(TCPトンネル)と通信します。リスナーはメッセージをWebサービスに転送し、表示します。Webサービスからのレスポンスはトンネルに返され、トンネルはレスポンスを表示して、BPELプロセス・サービス・コンポーネントに返します。
WS-Addressingは公開されている仕様であり、Oracle BPEL Process Managerでサポートされるデフォルトの相関方法です。WS-Addressingを使用するために、.bpel
ファイルおよび.wsdl
ファイルを編集する必要はありません。
プログラムとサービスの間で交換されるメッセージは、TCPトンネリングにより表示できます。これは、BPELプロセス・サービス・コンポーネント・フローとWebサービスの間で交換される正確なSOAPメッセージを表示する場合に、特に役立ちます。
SOAPメッセージを監視するには、フローとサービスの間にソフトウェア・リスナーを挿入します。フローはリスナー(TCPトンネル)と通信し、リスナーはサービスにメッセージを転送し、メッセージを表示します。同様に、サービスからのレスポンスはトンネルに返され、トンネルはレスポンスを表示してフローに返します。
サーバーとWebサービスの間で交換されたすべてのメッセージを表示する場合、該当するすべてのメッセージがサービスとの間で1回のリクエスト/リプライで交換されるため、同期サービスに対して必要なTCPトンネルは1つのみです。非同期サービスの場合、2つのトンネル(サービスの起動用に1つ、フローのコールバック・ポート用に1つ)を設定する必要があります。
Oracle BPEL Process Managerプロセスで開始される同期サービス用のTCPリスナーを設定する手順は、次のとおりです。
Axis TCPモニター(tcpmon
)のダウンロードおよびインストールの方法については、次のURLにアクセスしてください。
http://ws.apache.org/commons/tcpmon/
tcpmon
の使用方法については、次のURLにアクセスしてください。
http://ws.apache.org/axis/java/user-guide.html
クラスパスにaxis.jar
を設定します。
tcpmon
を開始します。
C:\...\> java org.apache.axis.utils.tcpmon localport remoteHost port_on_which_remote_server_is_running
composite.xml
ファイルで、フローのbinding.ws
の下にendpointURI
プロパティを追加し、サービスのエンドポイントを上書きします。
オペレーティング・システムのコマンド・プロンプトからant
を使用して、プロセスをコンパイルおよびデプロイします。
同じテクニックで、Axisや.NETなど、別のツール・キットからBPELプロセス・サービス・コンポーネントをWebサービスとして起動するために渡されるSOAPメッセージを参照できます。
非同期サービスからのコールバックのSOAPメッセージを表示するTCPリスナーを設定する手順は、次のとおりです。
ポートでのリスニングとOracle BPEL Process Managerポートでの送信を実行するTCPリスナーを起動します。
Oracle Enterprise Manager Fusion Middleware Controlコンソールを開きます。
「SOAインフラストラクチャ」メニューから、「SOA管理」→「共有プロパティ」の順に選択します。
「コールバック・サーバーURL」に値を指定します。このURLは、サーバーによって非同期コールバック・アドレスの一部としてインボーカに送信されます。
「SOAインフラストラクチャ」メニューから、「管理」→「システムMBeanブラウザ」の順に選択します。
「アプリケーション定義のMBean」→「oracle.soa.config」→「サーバー: soa_server」→「SCAComposite」の順に開きます。
soa_serverは、特定のサーバー・インスタンス名です(例: AdminServer)。
サーバーにデプロイされているすべてのSOAコンポジット・アプリケーションが表示されます。
次の手順に従って、このプロパティをコンポジット・アプリケーションに設定します。このアクションにより、コンポジット・アプリケーションのすべてのバインディングにプロパティ設定が適用されます。
コンポジットをクリックします。
「属性」タブが選択されていることを確認します。
「名前」列で、「プロパティ」をクリックします。
「追加」アイコンをクリックします。
新しく追加した「Element_number」(リストの最後に表示されます)を開きます。
numberは、最後のプロパティの番号の次の番号です。たとえば、プロパティ・リストに12個の要素があるときに新しいプロパティを追加すると、Element_13が表示されます。
「名前」フィールドに、oracle.webservices.local.optimization
と入力します。
「値」フィールドに、false
と入力します。
「複数」フィールドに、false
と入力します。
「適用」をクリックし、次に「戻る」をクリックします。
「操作」タブの「名前」列で、「保存」をクリックします。
「起動」をクリックして操作を実行します。
「戻る」をクリックするか、「システムMBeanブラウザ」ペインでノードをクリックします。
注意: プロパティを追加、削除または更新した後は、「システムMBeanブラウザ」ページの右上隅にある「キャッシュされたツリー・データのリフレッシュ」アイコンをクリックすると、新しいデータを参照できます。 |
次の手順に従って、このプロパティを特定のバインディングに設定します。
非同期Webサービスを起動するフローを開始します。これを同期TCPトンネリング構成と組み合せると、サービス開始リクエストを最初のTCPトンネル経由で送信できます。
非同期サービスからのコールバックは、TCPリスナーに表示されます。
Oracle JDeveloperユーザーは、組込みパケット・モニターを使用して、同期サービスと非同期サービスの両方についてSOAPメッセージを表示することもできます。
相関セットは、Webサービスのレスポンスを適切なBPELプロセス・サービス・コンポーネント・インスタンスに戻すための別の方法を提供します。相関セットを使用すると、非同期メッセージを識別して、非同期コールバックが確実に適切なクライアントを特定できるようにすることができます。
相関セットは、メッセージ本体の内容に基づいて非同期メッセージの相関を可能にするBPELメカニズムです。この方法を使用するには、.bpel
ファイルに相関セットを定義します。この方法は、WS-Addressingをサポートしないサービス用、または対話がA > B > A
ではなくA > B > C > A
という形式の場合など、一定の高度な対話パターン用に設計されています。
この項では、Oracle JDeveloperを使用して非同期サービスで相関セットを使用する方法について説明します。相関セットでは、メッセージ本体の内容に基づいて非同期メッセージを関係付けることができます。相関セットは、連携が単純なinvokeとreceiveアクティビティでない場合に定義します。この例では、invokeアクティビティが関連付けられていないreceiveアクティビティを3つ含むプロセスに相関セットを使用する方法を示します。
BPELプロセスがイベントを使用して双方向通信の相関を使用する方法を示すサンプル(bpel-202-CorrelatedEvents
)を参照する場合は、次のURLにアクセスしてください。
http://www.oracle.com/technology/sample_code/products/bpel
この項では、非同期サービスで相関セットを使用するための手順について説明します。
プロジェクトを作成する手順は、次のとおりです。
Oracle JDeveloperを起動します。
「ファイル」メイン・メニューから「新規」→「アプリケーション」の順に選択します。
「SOAアプリケーション」を選択し、「OK」をクリックします。
SOAアプリケーションの作成ウィザードが表示されます。
「アプリケーション名」フィールドに、MyCorrelationSetApp
と入力します。
残りのすべての設定に対するデフォルト値をそのまま使用し、「次へ」をクリックします。
「プロジェクト名」フィールドに、MyCorrelationSetComposite
と入力します。
残りのすべての設定に対するデフォルト値をそのまま使用し、「次へ」をクリックします。
「コンポジット・テンプレート」セクションで、「BPELを使用するコンポジット」を選択し、「終了」をクリックします。
「BPELプロセスの作成」ダイアログが表示されます。
次の値を入力します。
残りのすべての設定に対するデフォルト値をそのまま使用し、「終了」をクリックします。
次に、SOAPサービスを使用する3つのパートナ・リンクを作成します。
この項の内容は次のとおりです。
融資申請読取り用のアダプタ・サービスを持つ最初のパートナ・リンクを作成します。
申請レスポンス読取り用のアダプタ・サービスを持つ2番目のパートナ・リンクを作成します。
顧客レスポンス読取り用のアダプタ・サービスを持つ3番目のパートナ・リンクを作成します。
最初のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。
「MyCorrelationSet」 BPELプロセスをダブルクリックします。
「コンポーネント・パレット」で「BPELサービス」を展開します。
最初の「パートナ・リンク」アクティビティをデザイナの右スイムレーンにドラッグします。
最上部の3つ目のアイコン(「サービスの定義」アイコン)をクリックします。図8-4に示すように、この操作でアダプタ構成ウィザードが起動します。
「サービスまたはアダプタの設定」ダイアログで「ファイル・アダプタ」を選択し、「次へ」をクリックします。
「ようこそ」ダイアログで「次へ」をクリックします。
「サービス名」ダイアログの「サービス名」フィールドにFirstReceive
と入力し、「次へ」をクリックします。
「操作」ダイアログで「操作タイプ」として「Read File」を選択し、「次へ」をクリックします。「操作名」フィールドには、Readが自動的に入力されます。
「ディレクトリ名は物理パスとして指定されます」を選択します。
「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\FirstInputDirを選択します)。
「選択」をクリックします。
「次へ」をクリックします。
「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ・パラメータを入力します。
「次へ」をクリックします。
「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
「次へ」をクリックします。
「メッセージ」ダイアログで「スキーマの場所」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
適切なXSDスキーマ・ファイルを選択します。この例では、Book1_4.xsdはスキーマであり、スキーマ要素としてLoanApplが選択されています。
「OK」をクリックします。
「スキーマの場所」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_4.xsdとLoanAppl)。
「次へ」をクリックします。
「終了」をクリックします。
「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表8-2のようになります。
「OK」をクリックします。
2番目のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。
2番目の「パートナ・リンク」アクティビティを「FirstReceivePL」パートナ・リンク・アクティビティの下にドラッグします。
最上部の3つ目のアイコン(「サービスの定義」アイコン)をクリックします。
「ようこそ」ダイアログで「次へ」をクリックします。
「アダプタ・タイプ」ダイアログで「ファイル・アダプタ」を選択し、「次へ」をクリックします。
「サービス名」ダイアログの「サービス名」フィールドにSecondFileRead
と入力し、「次へ」をクリックします。この名前は、手順7で入力した名前とは異なる必要があります。
「操作」ダイアログで「操作タイプ」として「Read File」を選択します。
「操作名」フィールドの名前をRead1
に変更します。
「次へ」をクリックします。
「ディレクトリ名は物理パスとして指定されます」を選択します。
「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\SecondInputDirと入力します)。
「選択」をクリックします。
「次へ」をクリックします。
「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ処理パラメータを入力します。
「次へ」をクリックします。
「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
「次へ」をクリックします。
「メッセージ」ダイアログの「スキーマの場所」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
適切なXSDスキーマ・ファイルを選択します。この例では、Book1_5.xsdはスキーマであり、スキーマ要素としてLoanAppResponseが選択されています。
「OK」をクリックします。
「スキーマの場所」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_5.xsdとLoanAppResponse)。
「次へ」をクリックします。
「終了」をクリックします。
「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表8-3のようになります。
「OK」をクリックします。
3番目のパートナ・リンクとファイル・アダプタ・サービスを作成する手順は、次のとおりです。
3番目の「パートナ・リンク」アクティビティを「SecondReceivePL」パートナ・リンク・アクティビティの下にドラッグします。
最上部の3つ目のアイコン(「サービスの定義」アイコン)をクリックします。
「ようこそ」ダイアログで「次へ」をクリックします。
「アダプタ・タイプ」ダイアログで「ファイル・アダプタ」を選択し、「次へ」をクリックします。
「サービス名」ダイアログの「サービス名」フィールドにThirdFileRead
と入力し、「次へ」をクリックします。この名前は、手順7および手順5で入力した名前とは異なる必要があります。
「操作」ダイアログで「操作タイプ」として「Read File」を選択します。
「操作名」フィールドの名前をRead2
に変更します。この名前は一意である必要があります。
「次へ」をクリックします。
「ディレクトリ名は物理パスとして指定されます」を選択します。
「着信ファイル用のディレクトリ(物理パス)」フィールドの上で「参照」をクリックします。
ファイルの読取り元のディレクトリを選択します(この例ではC:\files\receiveprocess\ThirdInputDirと入力します)。
「選択」をクリックします。
「次へ」をクリックします。
「ファイルのフィルタ処理」ダイアログで、適切なファイル・フィルタ処理パラメータを入力します。
「次へ」をクリックします。
「ファイル・ポーリング」ダイアログで、適切なファイル・ポーリング・パラメータを入力します。
「次へ」をクリックします。
「メッセージ」ダイアログの「スキーマの場所」フィールドの横にある「参照」をクリックして、「タイプ・チューザ」ダイアログを表示します。
適切なXSDスキーマ・ファイルを選択します。この例では、Book1_6.xsdはスキーマであり、スキーマ要素としてCustResponseが選択されています。
「OK」をクリックします。
「スキーマの場所」フィールドと「スキーマ要素」フィールドに値が入力されます(この例ではそれぞれBook1_6.xsdとCustResponse)。
「次へ」をクリックします。
「終了」をクリックします。
「パートナ・リンク」ダイアログが再び表示されます。その他すべてのフィールドには値が自動的に入力されます。ダイアログは表8-4のようになります。
「OK」をクリックします。
完了すると、デザイナは図8-5のようになります。
次に、3つのreceiveアクティビティ(各パートナ・リンクにつき1つずつ)を作成します。receiveアクティビティでは、情報の送信元のパートナ・リンクを指定します。
最初のreceiveアクティビティを作成する手順は、次のとおりです。
「コンポーネント・パレット」の「BPELアクティビティ」を開きます。
「コンポーネント・パレット」セクションの「BPELアクティビティとコンポーネント」リストから、receiveアクティビティをデザイナの「receiveInput」receiveアクティビティの下にドラッグします。
「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。
表8-5に示す詳細を入力して、最初のパートナ・リンク(FirstReceive)を最初のreceiveアクティビティと関連付けます。
表8-5 「Receive」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
|
パートナ・リンク |
FirstReceive |
インスタンスの作成 |
このチェック・ボックスを選択します。 |
「操作」(Read)フィールドは自動的に入力されます。
「変数」フィールドの右側にある最初のアイコンをクリックします。これは、変数を自動作成するアイコンです。
「変数の作成」ダイアログで「OK」をクリックします。
receiveFirst_Read_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。
手順4の説明にあるように「インスタンスの作成」チェック・ボックスが選択されていることを確認します。
「OK」をクリックします。
2番目のreceiveアクティビティを作成する手順は、次のとおりです。
「コンポーネント・パレット」から2番目のreceiveアクティビティを「receiveFirst」receiveアクティビティの下にドラッグします。
「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。
表8-6に示す詳細を入力して、2番目のパートナ・リンク(SecondReceivePL)を2番目のreceiveアクティビティと関連付けます。
表8-6 「Receive」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
|
パートナ・リンク |
SecondFileRead |
インスタンスの作成 |
このチェック・ボックスは選択しないでください。 |
「操作」(Read1)フィールドは自動的に入力されます。
「変数」フィールドの右側にある最初のアイコンをクリックします。
「変数の作成」ダイアログで「OK」をクリックします。
receiveSecond_Read1_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。
「OK」をクリックします。
3番目のreceiveアクティビティを作成する手順は、次のとおりです。
「コンポーネント・パレット」から3番目のreceiveアクティビティを「receiveSecond」receiveアクティビティの下にドラッグします。
「Receive」アイコンをダブルクリックし、「Receive」ダイアログを表示します。
表8-7に示す詳細を入力して、3番目のパートナ・リンク(ThirdReceivePL)を3番目のreceiveアクティビティと関連付けます。
表8-7 「Receive」ダイアログのフィールドと値
フィールド | 値 |
---|---|
名前 |
|
パートナ・リンク |
ThirdFileRead |
インスタンスの作成 |
このチェック・ボックスは選択しないでください。 |
「操作」(Read2)フィールドは自動的に入力されます。
「変数」フィールドの右側にある最初のアイコンをクリックします。
「変数の作成」ダイアログで「OK」をクリックします。
receiveThird_Read2_InputVariableという名前の変数が自動的に「変数」フィールドに作成されます。
「OK」をクリックします。
各receiveアクティビティが、特定のパートナ・リンクに関連付けられました。
次に、相関セットを作成します。相関トークンのセットは、相関グループのすべてのメッセージで共有されるプロパティのセットです。
最初の相関セットを作成する手順は、次のとおりです。
Oracle JDeveloperの「構造」ウィンドウで「相関セット」を右クリックし、「すべての子ノードを開く」を選択します。
2番目の「相関セット」フォルダを右クリックして、「相関セットの作成」を選択します。
「相関セットの作成」ダイアログの「名前」フィールドでCorrelationSet1
と入力します。
「プロパティ」セクションで、「追加」アイコンをクリックして「プロパティ・チューザ」ダイアログを表示します。
「プロパティ」を選択し、「追加」アイコン(上の最初のアイコン)をクリックして「相関セット・プロパティの作成」ダイアログを表示します。
「名前」フィールドに、NameCorr
と入力します。
「タイプ」フィールドの右側にある「参照」アイコンをクリックします。
「タイプ・チューザ」ダイアログで「string」を選択し、「OK」をクリックします。
「OK」をクリックして、「相関セット・プロパティの作成」ダイアログ、「プロパティ・チューザ」ダイアログおよび「相関セットの作成」ダイアログを閉じます。
2番目の相関セットを作成する手順は、次のとおりです。
Oracle JDeveloperの「構造」ウィンドウの「相関セット」セクションに戻ります。
「相関セット」フォルダを右クリックして、「相関セットの作成」を選択します。
「相関セットの作成」ダイアログの「名前」フィールドでCorrelationSet2
と入力します。
「プロパティ」セクションで、「追加」アイコンをクリックして「プロパティ・チューザ」ダイアログを表示します。
「プロパティ」を選択し、「追加」アイコンをクリックして「相関セット・プロパティの作成」ダイアログを表示します。
「名前」フィールドに、IDCorr
と入力します。
「タイプ」フィールドの右側にある「参照」アイコンをクリックします。
「タイプ・チューザ」ダイアログで「double」を選択し、「OK」をクリックします。
「OK」をクリックして、「相関セット・プロパティの作成」ダイアログ、「プロパティ・チューザ」ダイアログおよび「相関セットの作成」ダイアログを閉じます。
次に、相関セットをreceiveアクティビティと関連付けます。次の相関セットのタスクを実行します。
最初の相関グループで、最初と2番目のreceiveアクティビティをCorrelationSet1相関セットと関連付けます。
2番目の相関グループで、2番目と3番目のreceiveアクティビティをCorrelationSet2相関セットと関連付けます。
最初の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。
「receiveFirst」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
「相関」タブをクリックします。
2番目にある「追加」アイコンをクリックして、「相関セット・チューザ」ダイアログを表示します。
「CorrelationSet1」を選択し、次に「OK」をクリックします。
「開始」列を「はい」に設定します。「はい」に設定すると、このセットが、交換するメッセージに含まれるプロパティの値で開始されます。
「OK」をクリックします。
2番目の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。
「receiveSecond」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
「相関」タブをクリックします。
2番目にある「追加」アイコンをクリックして、「相関セット・チューザ」ダイアログを表示します。
「CorrelationSet2」を選択し、次に「OK」をクリックします。
「開始」列を「はい」に設定します。
「追加」をクリックして「CorrelationSet1」を選択します。
「OK」をクリックします。
「CorrelationSet1」の「開始」列を「いいえ」に設定します。
「OK」をクリックします。
これにより、最初と2番目のreceiveアクティビティが1つの相関グループにまとめられます。
3番目の相関セットをreceiveアクティビティに関連付ける手順は、次のとおりです。
「receiveThird」receiveアクティビティをダブルクリックし、「Receive」ダイアログを表示します。
「相関」タブをクリックします。
2番目にある「追加」アイコンをクリックして、「相関セット・チューザ」ダイアログを表示します。
「CorrelationSet2」を選択し、次に「OK」をクリックします。
「CorrelationSet2」の「開始」列を「いいえ」に設定します。
「OK」をクリックします。
これにより、2番目と3番目のreceiveアクティビティが2番目の相関グループにまとめられます。
プロパティ・エイリアスを使用すると、グローバル・プロパティを特定のメッセージ・パートのフィールドにマップできます。このアクションにより、プロパティ名を、メッセージのパートと場所を表すエイリアスにできます。このエイリアスは、XPath式で使用できます。
NameCorr相関セットに次の2つのプロパティ・エイリアスを作成します。
NameCorrをreceiveFirst receiveアクティビティのLoanApplメッセージ・タイプ・パートにマップします。このreceiveアクティビティをFirstReceivePLパートナ・リンク(FirstReceive.wsdlファイルで定義)と関連付けます。
NameCorrをreceiveSecond receiveアクティビティの受信メッセージ・タイプ・パートLoanAppResponseにマップします。このreceiveアクティビティをSecondReceivePLパートナ・リンク(SecondFileRead.wsdlファイルで定義)と関連付けます。
NameCorrのプロパティ・エイリアスを作成する手順は、次のとおりです。
Oracle JDeveloperの「構造」ウィンドウで、「プロパティ・エイリアス」を右クリックします。
「プロパティ・エイリアスの作成」を選択します。
「プロパティ」リストから「NameCorr」を選択します。
「メッセージ・タイプ」→「Webサービス」→「FirstReceivePL」→「FirstReceive.wsdl」→「メッセージ・タイプ」→「LoanAppl_msg」→「Part - LoanAppl」の順に展開して選択します。
「問合せ」フィールドで[Ctrl]キーを押しながら[Space]キーを押して、次のXPath式を定義します。
/ns2:LoanAppl/ns2:Name
「OK」をクリックします。
「メッセージ・タイプ」→「プロジェクトのWSDLファイル」→「SecondFileRead.wsdl」→「メッセージ・タイプ」→「LoanAppResponse_msg」→「Part - LoanAppResponse」の順に展開して選択します。
「問合せ」フィールドで[Ctrl]キーを押しながら[Space]キーを押して、次のXPath式を定義します。
/ns4:LoanAppResponse/ns4:APR
IDCorr相関セットに次の2つのプロパティ・エイリアスを作成します。
IDCorrをreceiveSecond receiveアクティビティのLoanAppResponseメッセージ・タイプ・パートにマップします。このreceiveアクティビティをSecondReceivePLパートナ・リンク(SecondFileRead.wsdlファイルで定義)と関連付けます。
IDCorrをreceiveThird receiveアクティビティのCustResponseメッセージ・タイプ・パートにマップします。このreceiveアクティビティをThirdReceivePLパートナ・リンク(ThirdFileRead.wsdlファイルで定義)と関連付けます。
IDCorrのプロパティ・エイリアスを作成する手順は、次のとおりです。
「構造」ウィンドウで、「プロパティ・エイリアス」を右クリックします。
「プロパティ・エイリアスの作成」を選択します。
「プロパティ」リストから「IDCorr」を選択します。
「メッセージ・タイプ」→「プロジェクトのWSDLファイル」→「SecondFileRead.wsdl」→「メッセージ・タイプ」→「LoanAppResponse_msg」→「Part - LoanAppResponse」の順に展開して選択します。
「問合せ」フィールドで[Ctrl]キーを押しながら[Space]キーを押して、次のXPath式を定義します。
/ns4:LoanAppResponse/ns4:APR
「OK」をクリックします。
「メッセージ・タイプ」→「プロジェクトのWSDLファイル」→「ThirdFileRead.wsdl」→「メッセージ・タイプ」→「CustResponse_msg」→「Part - CustResponse」の順に展開して選択します。
「問合せ」フィールドで[Ctrl]キーを押しながら[Space]キーを押して、次のXPath式を定義します。
/ns6:CustResponse/ns6:APR
これで、設計は完了します。
WSDLファイルのコンテンツを確認する手順は、次のとおりです。
「アプリケーション・ナビゲータ」を更新する場合
相関セット・プロパティのNameCorr
とIDCorr
は、Oracle JDeveloperの「アプリケーション・ナビゲータ」では、MyCorrelationSet_Properties.wsd
l
ファイルに定義されています。例8-8に例を示します。
例8-8 相関セット・プロパティ
<definitions name="properties" targetNamespace="http://xmlns.oracle.com/MyCorrelationSet/correlationset" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <bpws:property name="NameCorr" type="xsd:string"/> <bpws:property name="IDCorr" type="xsd:double"/> </definitions>
例8-9に示すように、プロパティ・エイリアスはMyCorrelationSet.wsdl
ファイルに定義されています。
例8-9 プロパティ・エイリアス
<bpws:propertyAlias propertyName="ns1:NameCorr" messageType="ns3:LoanAppl_msg" part="LoanAppl" query="/ns2:LoanAppl/ns2:Name"/> <bpws:propertyAlias propertyName="ns1:NameCorr" messageType="ns5:LoanAppResponse_msg" part="LoanAppResponse" query="/ns4:LoanAppResponse/ns4:APR"/> <bpws:propertyAlias propertyName="ns1:IDCorr" messageType="ns5:LoanAppResponse_msg" part="LoanAppResponse" query="/ns4:LoanAppResponse/ns4:APR"/> <bpws:propertyAlias propertyName="ns1:IDCorr" messageType="ns7:CustResponse_msg" part="CustResponse" query="/ns6:CustResponse/ns6:APR"/>
この例では、BPELプロセス・サービス・コンポーネントはWebサービス・プロバイダとしては作成されていないので、MyCorrelationSet.wsdl
ファイルはBPELプロセス・サービス・コンポーネントでは参照されません。このため、旧WSDLに定義されている相関セットを参照するには、MyCorrelationSet.wsdl
ファイルをFirstReceive.wsdl
ファイル内にインポートする必要があります。例8-10に例を示します。