同期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>