同期Webサービスでは、レスポンスは即時に問合せに返されます。BPELは、パートナ・リンクによって同期Webサービスに接続し、データを送信し、同期コールバックを使用してリプライを受信できます。
この章の内容は次のとおりです。
同期Webサービスの使用方法は、104.SyncQuoteConsumer
で具体的に示されます。このサンプルでは、Webサービスに株価コードを送信し、かわりに株価を受け取るBPELプロセスを示します。このサンプルでは、株価WebサービスのCreditRatingService.wsdl
ファイル(コールされるWebサービス)、およびクライアントのQuoteConsumer.bpel
ファイルとbpel.xml
デプロイメント・ディスクリプタ・ファイルでの同期機能の定義方法について説明します。
この章では、パートナ・リンクの確立方法および同期コールバックの設定方法について説明します。また、同期コールバックの実行に必要なコンポーネントについて説明し、これらのコンポーネントをコーディングする方法を考察し、同期コールバックを設定する方法を示します。
関連項目: この章では、次のファイルを例として使用しています。
|
同期コールバックには、次のコンポーネントが必要です。
パートナ・リンク: タスクを実行するためにBPELプロセスが接続するWebサービスの場所と役割、およびWebサービスとBPELプロセスの間で情報の受渡しに使用する変数を定義します。BPELプロセスがコールする各Webサービスに対して、パートナ・リンクが必要です。
invokeアクティビティ: BPELプロセス内でデータを送受信するためのポートをオープンします。このポートを使用して、必要なデータの送信およびレスポンスの受信を行います。株価情報サービスの例では、invokeアクティビティは顧客が入力した株価コードを株価サービスに送信し、かわりに株価を受け取ります。同期コールバックの場合、関数の送受信に必要なポートは1つのみです。
各ドメインに属性syncMaxWaitTime
があります。 この属性のデフォルトは45
秒ですが、ドメイン管理者が再構成できます。指定された時間内にBPELプロセスがリプライを受信しないと、アクティビティはエラーとなります。
この項の内容は次のとおりです。
BPELコードでは、パートナ・リンクはリンク名とタイプ、およびパートナ・サービスとの相互作用におけるBPELプロセスの役割を定義します。
BPELソース・コードでは、StockQuoteService
パートナ・リンク定義は次のようになります。
<partnerLinks> <!-- The 'client' role represents the requester of this service. It is used for callback. The location and correlation information associated with the client role are automatically set using WS-Addressing. --> <partnerLink name="client" partnerLinkType="samples:QuoteConsumer" myRole="QuoteConsumerProvider" partnerRole="QuoteConsumerRequester"/> <partnerLink name="StockQuoteService"partnerLinkType="services:StockQuoteService" partnerRole="StockQuoteServiceProvider"/> </partnerLinks>
パートナ・リンクの次に、BPELプロセス全体からアクセスできるグローバル変数を定義します。これらの変数のタイプは、プロセスのWSDLで定義されます。
<variables> <!-- Reference to the message passed as input during initiation --> <variable name="input" messageType="tns:QuoteConsumerRequestMessage"/> <!-- Reference to the message that will be sent back to the requestor during callback --> <variable name="output" messageType="tns:QuoteConsumerResultMessage"/> <variable name="request" messageType="services:StockQuoteServiceRequest"/> <variable name="response" messageType="services:StockQuoteServiceResponse"/> </variables>
WSDLファイルは、BPELプロセスへのインタフェース(受渡しされるメッセージ、サポートされる操作およびその他のパラメータ)を定義します。
WebサービスのQuoteConsumer.wsdl
ファイルには、BPELプロセスとの連携を有効化する次の2つのセクションが含まれています。
QuoteConsumer.wsdlファイルのpartnerLinkTypeセクション
QuoteConsumer.wsdl
ファイルのpartnerLinkType
セクションは、BPELプロセスと融資申請承認Webサービスとの変換について次のような特性を定義しています。
それぞれが果たすロール(操作)
対話のコンテキスト内でメッセージを受信するためにそれぞれが提供するportType
<!-- PartnerLinkType definition --> <!-- the QuoteConsumer partnerLinkType binds the service and requestor portType into an asynchronous conversation. --> <plnk:partnerLinkType name="QuoteConsumer"> <plnk:role name="QuoteConsumerProvider"> <plnk:portType name="tns:QuoteConsumer"/> </plnk:role> <plnk:role name="QuoteConsumerRequester"> <plnk:portType name="tns:QuoteConsumerCallback"/> </plnk:role> </plnk:partnerLinkType>
QuoteConsumer.wsdlファイルのportTypeセクション
ポート・タイプは対話内で参加者が実装する一連の関連操作です。ポート・タイプは、受渡しされる情報や、その情報の形式などを定義します。同期コールバックでは、リクエストの送信とレスポンスの受信の両方に対して1つのポート・タイプのみが必要ですが、非同期コールバック(リプライが即時に返されないコールバック)では、リクエストの送信に1つ、着信するリプライの受信にもう1つ、合計2つのポート・タイプが必要です。
QuoteConsumer.wsdl
ファイルのportType
セクションを見てみます。これは、顧客が入力した株価コードをクライアントが送信する先の株価情報Webサービスです。
<!-- PortType definition --> <!-- portType implemented by the QuoteConsumer BPEL process --> <portType name="QuoteConsumer"> <operation name="initiate"> <input message="tns:QuoteConsumerRequestMessage"/> </operation> </portType> <!-- portType implemented by the requester of QuoteConsumer BPEL process for asynchronous callback purposes --> <portType name="QuoteConsumerCallback"> <operation name="onResult"> <input message="tns:QuoteConsumerResultMessage"/> </operation> </portType>
同期サービスにはポート・タイプが1つ定義されます。ポートは同期プロセスを開始し、レスポンスを使用してクライアントにコールバックします。この例では、portType
CreditRatingService
は株価コードを受け取り株価を返します。
パートナ・リンクの作成時にサービスを検索できるように、Universal Description, Discovery, and Integration(UDDI)ブラウザが提供されています。Web Services Inspection Language(WSIL)およびUDDIは、サービスの公開と検索を支援します。
UDDIはWebベースの分散ディレクトリで、企業が自社情報をインターネット上のリストに登録しておき、互いに検索できる、従来の電話帳のような仕組みです。インフラストラクチャを確実に配備することで、仕様により、Simple Object Access Protocol(SOAP)を利用した高レベルの機能が提供されます。
WSILは、分散方式でのサービス検索に取り組み、単純な拡張XML文書形式を使用して任意の場所にサービス記述情報を分散できます。UDDIとは異なり、ビジネス・エンティティ情報とは関連がなく、特定のサービス記述形式も指定しません。WSILでは、ユーザーがサービス・プロバイダについて熟知しているものと想定し、WSDLなどのその他のサービス記述メカニズムを使用します。
パートナ・リンクの作成時にこのレジストリにアクセスするには、最初に次の手順でUDDIレジストリへの接続を作成する必要があります。
Oracle JDeveloperの「接続ナビゲータ」で「UDDIレジストリ」を右クリックします。
「UDDIレジストリ接続の作成」を選択します。
ウィザードのステップに従って接続を作成します。
パートナ・リンクを作成する際には、リモート・サーバー上のWebサービスも選択できます。リモートの場所を指定するには、次のファイルを編集します。
SOA_Oracle_Home¥bpel¥system¥services¥install¥config¥inspection.wsil
これにより、WebサービスにOracle JDeveloperからアクセスできるようになります。「パートナ・リンクの作成」ウィンドウでパートナ・リンクを作成するときは、「サービス・エクスプローラ」アイコンをクリックします。これにより、「サービス・エクスプローラ」ウィンドウが表示され、リモートWebサービスの選択が可能になります。
invoke
アクティビティにはvariable
セクションで定義されたrequest
グローバル入力変数が含まれます。信用格付けWebサービスでは、このrequest
グローバル入力変数を使用します。この変数には、顧客の社会保障番号が格納されます。信用格付けサービスによって返された信用格付けは、response変数に格納されます。
<sequence> <!-- Receive input from requestor. Note: This maps to operation defined in QuoteConsumer.wsdl --> <receive name="receiveInput" partnerLink="client" portType="samples:QuoteConsumer" operation="initiate" variable="input" createInstance="yes"/> <assign> <copy> <from variable="input" part="payload" query="/tns:symbol"/> <to variable="request" part="symbol" query="/symbol"/> </copy> </assign> <!-- Generate content of output message based on the content of the input message. --> <invoke name="invokeStockQuoteService" partnerLink="StockQuoteService"/> <assign> <copy> <from variable="response" part="result" query="/result"/> <to variable="output" part="payload" query="/tns:result"/> </copy> </assign> <!-- Asynchronous callback to the requester. Note: the callback location and correlation id is transparently handled using WS-addressing. --> <invoke name="replyOutput" partnerLink="client" portType="samples:QuoteConsumerCallback" operation="onResult" inputVariable="output"/> </sequence>
この項では、QuoteConsumer.bpel
ファイルを使用して同期コールバック操作について説明します。詳細な手順は、http://www.oracle.com/technology/bpel
を参照し、まず「Training Material」にあるファイルをダウンロードしてください。
次の図に、QuoteConsumer.bpel
ファイルのダイアグラムを示します。ここでは、5つのアクティビティを使用する単純なアプリケーションが定義されています。
次のアクションを行います。
QuoteConsuter.wsdl
ファイルで定義したように、receiveInput receiveアクティビティは、ユーザー(クライアント)からの入力を受け取ります。
最初のassignアクティビティは、クライアントからのデータをパッケージ化し、invokeStockQuoteサービスで受取り可能にします。
invokeStockQuoteServiceアクティビティは、再パッケージ化されたデータをStockQuoteServiceサービスに送信し、レスポンスを受け取ります。
2番目のassignアクティビティは、このレスポンスをreplyOutputアクティビティに再パッケージ化し、クライアント・アプリケーションで受取り可能にします。
replyOutputアクティビティは、再パッケージ化されたレスポンスをクライアントに返します。
次のBPELコードにより、同期コールバックが実行されます。
<assign> <copy> <from variable="input" part="payload" query="/tns:symbol"/> <to variable="request" part="symbol" query="/symbol"/> </copy> </assign> <invoke name="invokeStockQuoteService" partnerLink="StockQuoteService" portType="services:StockQuoteService" operation="process" inputVariable="request" outputVariable="response"/> <!-- Generate content of output message based on the content of the input message. --> <assign> <copy> <from variable="response" part="result" query="/result"/> <to variable="output" part="payload" query="/tns:result"/> </copy> </assign>