この章では、BPELプロセスからの非同期Webサービスの構成および起動方法について説明します。また、複数のreceiveまたはpickアクティビティで同じパートナ・リンクが使用されている場合に適切なエンドポイントにコールバック・メッセージをルーティングする方法、パートナ・リンク操作レベルで冪等性を管理する方法、実行時に動的パートナ・リンクを作成する方法、動的パートナ・リンク環境でセキュリティ証明書およびWSDLファイルをオーバーライドする方法、およびWS-Addressingを使用する方法について説明します。
この章には次の項が含まれます:
非同期メッセージ形式は、サービス(融資処理など)でクライアント・リクエストの処理に時間がかかる環境で役に立ちます。また、非同期サービスは、同期サービスよりも優れた耐障害性を持ち、かつスケーラブルなアーキテクチャも提供します。
この項では、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サービスを選択します。
名前
パートナ・リンクの名前を入力します(この例では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アクティビティの直後にドラッグします。
第8.2.1.2項「invokeアクティビティの追加」のステップ3からステップ7と同様の手順で、「変数の作成」ダイアログを開き、受信情報を格納する変数を作成します。
図8-2に、BPEL 1.1の「変数の作成」ダイアログを示します。
注意: BPEL仕様のバージョン2.0をサポートするBPELプロジェクトでは、「変数の作成」ダイアログに、変数タイプのインラインを(変数、式、リテラル、パートナ・リンク、プロパティなどとして)初期化できる「初期化」タブがあります。詳細は、第6.5.2項「BPEL 2.0のインラインfrom-specを使用した変数の初期化」を参照してください。 |
Receiveアクティビティをダブルクリックし、名前をreceive_invoke
に変更します。
「パートナ・リンク」リストからパートナ・リンクを選択します(この例では「LoanService」を選択します)。
「操作」リストから「onResult」を選択します。「インスタンスの作成」チェック・ボックスは選択しないでください。
第8.2.1.2項「invokeアクティビティの追加」のステップ3からステップ7で作成した変数を選択します。
「OK」をクリックします。
receiveアクティビティと出力変数が作成されます。BPELファイル(この例ではLoanBroker.bpel)の最初のreceiveアクティビティが最初のBPELプロセス・サービス・コンポーネント・インスタンスを作成したため、2つ目のインスタンスを作成する必要はありません。
この項では、非同期Webサービス起動時の処理内容について説明します。
WSDLファイル(この例ではLoanService
)のportType
セクションは、非同期サービスに使用するポートを定義します。
非同期サービスにはポート・タイプが2つ定義されます。各ポート・タイプは一方向操作を実行します。この例では、次のとおりです。
一方のポート・タイプが非同期プロセスに応答します。
他方のものが、非同期レスポンスでクライアントにコールバックします。
例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.8項「非同期サービスでのWS-Addressingの使用」で説明)を使用して、クライアント・リクエストに固有の相関IDが送信されます。複数のプロセスがサービス・コールバックを待機している可能性があるため、サーバーでは、どのBPELプロセス・サービス・コンポーネント・インスタンスが融資申請承認Webサービスからのコールバック・メッセージを待機しているかを把握する必要があります。相関IDによって、サーバーは、レスポンスを適切なリクエスト・インスタンスと関係付けることができます。
最初のreceive
アクティビティには、createInstance
属性があります。この最初のreceive
アクティビティでは、createInstance
要素はyes
に設定されています。これにより、新しいBPELプロセス・サービス・コンポーネント・インスタンスが起動されます。対話のためには、少なくとも1つのインスタンスが起動している必要があります。このため、2番目のreceive
アクティビティではcreateInstance
変数をno
に設定します。
例8-6に、createInstance
属性のソース・コードを示します。
非同期コールバックの待機中、長期間にわたる非同期プロセスとその現在の状態の情報をデータベース内に自動的に保存するには、データベースをデハイドレーション・ストアとして使用します。データベースにプロセスを格納することにより、プロセスを維持し、システムの停止やネットワークの問題が発生した場合の状態や信頼性の低下を防ぎます。この機能により、BPELプロセス・サービス・コンポーネントの信頼性とスケーラビリティの両方が向上します。また、クラスタリングおよびフェイルオーバーのサポートにもこの機能を使用できます。
invokeアクティビティとreceiveアクティビティの間にこのポイントを挿入します。dehydrateアクティビティを使用してデハイドレーション・ポイントを明示的に指定することもできます。詳細は、A.2.9項「dehydrateアクティビティ」を参照してください。
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.example.com:80/a.jsp @http://myhost.us.example.com:8888/soa-infra/services/HelloWorldApp/HelloWorld! 1.0*2007-10-22_14-33-04_195/client </property> </binding.ws> </reference>
複数のクライアント・コンポーネントがそのリモートのWSDLファイルを使用して1つのSOAコンポジット・アプリケーションを起動した場合は、リモート・コンポジットをコールしている元のクライアントにreceiveアクティビティが存在する場合にのみ、コールバック・レスポンスをこのクライアントで取得できます。元のクライアントにreceiveアクティビティが存在せず、コンポジットをコールする後続のクライアントのいずれにもreceiveアクティビティが存在しない場合、レスポンス・メッセージは失われます。これにより、元のクライアント・プロセスのリカバリ状態となります。
これは予想された動作です。これは、起動されているコンポジットでは、receiveアクティビティがどのクライアントに存在するか、またはクライアントが実際にBPELプロセス・サービス・コンポーネントであるかどうかを認識できないためです。
receiveアクティビティは一種のインバウンド・メッセージ・アクティビティ(IMA)です。IMAのその他の例は次のとおりです。
scopeアクティビティ(BPEL 1.1)またはpickアクティビティのonMessageブランチ
BPEL 2.0のscopeアクティビティのonEventブランチ
BPEL 2.0仕様では、複数のIMAを相互に使用する、または拡張アクティビティから導出した他のIMAとともに使用することができます。実行時の動作を一定に保つために、BPEL 2.0仕様ではinitiate
属性をjoin
に設定した相関セットを使用できます。ただし、Oracle BPEL Process ManagerにおけるBPEL 2.0仕様では、この動作がサポートされていません。複数のIMAをサポートする唯一の方法は、それらをpickアクティビティのonMessageブランチとしてコーディングする(つまり、createInstance
をyes
に設定する)ことです。また、Oracle BPEL Process Managerでは、複数IMAのその他の形、たとえば2つのブランチを持つflowアクティビティで、それぞれがreceiveアクティビティを持ち、createInstance
の設定がyes
で、相関セットのinitiate
の設定がjoin
であるなどの形もサポートされていません。
解決方法として、次のように、交互に2つのreceiveアクティビティがある2つのBPELプロセスを設計する必要があります。
Process1: receive1の後にreceive2が続きます。receive1でのみ、createInstance
がyes
に設定されています。
Process2: receive2の後にreceive1が続きます。receive2でのみ、createInstance
がyes
に設定されています。
同じことが、receiveアクティビティとpickアクティビティ、または2つのpickアクティビティなど、IMAの他の組合せにも適用されます。
invokeアクティビティ(およびreceiveアクティビティなどの他のアクティビティ、pickまたはscopeアクティビティのonMessageブランチ)の「対話ID」フィールドにオプションの対話ID値を入力することもできます。
対話IDは、非同期対話中にプロセス・インスタンスを識別します。デフォルトでは、BPELプロセス・サービス・エンジンにより、WSAアドレッシングで指定されているように、対話(複数のinvokeアクティビティおよびreceiveアクティビティにまたがる可能性があります)ごとに一意のIDが生成されます。必要に応じて、使用するサービス・エンジンに独自の値を指定できます。対話IDはbpelx:conversationId
拡張要素で実装されます。
例8-8に、BPELバージョン1.1をサポートするBPELプロジェクト内のbpelx:conversationId
拡張要素の例を示します。bpelx:conversationId
拡張要素はXPath式をとります。
例8-9に、BPELバージョン2.0をサポートするBPELプロジェクト内のbpelx:conversationId
拡張要素の例を示します。bpelx:conversationId
拡張要素はBPEL 2.0 XPath式をとります。
11gリリース1では、複数のreceiveまたはpickアクティビティが同じパートナ・リンクに関連付けられている場合に、適切なエンドポイント・アドレスへのコールバック・メッセージのルーティングを解決するには、replyToAddress
正規化されたメッセージのプロパティが必要です。
これは、BPELプロセス・サービス・エンジンでは、replyToAddress
プロパティが格納されるのは、起動元のreceiveまたはpickアクティビティでパートナ・リンクからのリクエストを受信するときの1回のみであるためです。replyToAddress
は、コールバック・メッセージをルーティングし、中間プロセスのreceiveまたはpickアクティビティが使用されている場合にリセットされません。replyToAddress
プロパティは、bpelx:inputProperty
拡張要素を使用します。
中間プロセスのreceiveアクティビティの後に続くinvokeアクティビティ(コールバック用)に対して、このプロパティをクライアントのreplyToAddress
に設定してください。つまり、クライアントが、中間プロセスのreceiveアクティビティに対してWS-Addressing replyTo
情報を送信する場合でも、assignアクティビティを使用してそれを動的に設定しないかぎり、それがパートナ・リンクに設定されることはありません。
たとえば、BPELプロセスが例8-10に示すとおりであるとします。
例8-10 BPELプロセス
Caller Callee ----------------------------------------------------------- <receive> <receive> Initiate CS1 <invoke>initiate CS1 --------> <receive> Use CS1 <wait> <receive>use CS1 <-------- <invoke> <invoke>
複数のreceiveおよびpickアクティビティで同じパートナ・リンクが使用されている場合において適切なエンドポイントにコールバック・メッセージをルーティングする手順は、次のとおりです。
中間プロセスのreceiveアクティビティからクライアントのreplyToAddress
値を取得します。
<receive name="receiveMsgFromAccessor" partnerLink="midprocess_client" portType="client:mySingletonBPEL" operation="process" variable="ReceiveMidProcess" createInstance="no"> <bpelx:property name="replyToAddress" variable="var_replyToAddress"/> <correlations> <correlation set="<YourCorrset>" initiate="no"/> </correlations> </receive>
そのinvokeアクティビティ(コールバック用)で、「プロパティ」タブをクリックします。
下にスクロールしてreplyToAddressプロパティを見つけます。wsa.replyToAddressまたはbpel.replyToAddressを選択しないでください。
「値」列で、ダブルクリックして省略記号を表示します。
省略記号をクリックします。
「アダプタ・プロパティ値」ダイアログが表示されます。
値として変数名を入力(この例では、手順1のvar_replyToAddress
を入力)し、「OK」をクリックします。
「タイプ」列で、replyToAddressプロパティの行をクリックします。
表示されるリストから、「入力」を選択します。
図8-3に示すように、Invokeの編集ダイアログが表示されます。
「適用」→「OK」の順にクリックします。
Oracle BPELデザイナで、「ソース」をクリックします。
BPELプロセス・ファイル内のinvokeアクティビティは次のようになります。
<invoke name="callbackAccessor" partnerLink="midprocess_client" portType="client:mySingletonBPELCallback" operation="processResponse" inputVariable="CallbackAccessorVar" bpelx:invokeAsDetail="no"> <bpelx:inputProperty name="replyToAddress" variable="var_replyToAddtess"/>
idempotentアクティビティは、問題なく再試行できるアクティビティです。idempotentアクティビティは、永続プロセスと一時プロセスの両方に適用されます。冪等性は、パートナ・リンクの操作レベルで管理できます。たとえば、いくつかのパートナ・リンクでは複数の操作を公開できます(たとえば、getEmployee
、depositPayCheck
など)。いくつかの操作を冪等として定義できます(たとえば、getEmployee
)。これによって、これらの操作を複数回コールできるようになります。他の操作は、冪等にする必要がない場合があり(たとえば、depositPayCheck
)、この設定は不要です。デハイドレーションは、非冪等操作の後に発生します。
デフォルトでは、すべてのパートナ・リンク操作は冪等です。必要な場合は、操作を非冪等に設定できます。この設定は、idempotent
デプロイメント・ディスクリプタのプロパティと同じ機能を、より詳細な操作レベルで提供します。
idempotent
デプロイメント・ディスクリプタのプロパティの詳細は、第12.10.6項「idempotentプロパティとフォルト処理に関する注意事項」および第C.1項「デプロイメント・ディスクリプタのプロパティの概要」を参照してください。
パートナ・リンク操作レベルで冪等性の管理する手順は、次のとおりです。
Oracle BPELデザイナで、冪等性の管理対象となる操作が含まれているパートナ・リンクをダブル・クリックします。
パートナ・リンクの「冪等性」タブをクリックします。
デフォルトでは、「冪等」列ですべての操作が冪等であると選択されています。
操作を非冪等と定義する場合は、その操作の「冪等」チェック・ボックスの選択を解除します。図8-4に詳細を示します。
「適用」をクリックします。
「OK」をクリックします。
冪等性およびidempotent
プロパティの詳細は、第C.1項「デプロイメント・ディスクリプタのプロパティの概要」を参照してください。
SOAコンポジット・アプリケーションを設計する場合、次の課題に直面することがあります。
サービス・エンドポイント(アドレス)が設計時にわからない場合があります。
アプリケーションの実行中に、エンドポイント参照の変更が必要な場合があります。
動的パートナ・リンク機能を使用すると、BPELバージョン1.1および2.0の実行時に使用するために、エンドポイント参照をパートナ・リンクに動的に割り当てることができます。動的パートナ・リンクでは、switchアクティビティに類似した条件が提供され、この条件は実行時に評価されます。
実行時に使用するために動的パートナ・リンクを設計時に作成する手順は、次のとおりです。
同じportType
を使用する複数のサービスが含まれているWSDLファイルを作成します。
<service name="AmericanLoan"> <port name="LoanServicePort" binding="tns:LoanServiceBinding"> <soap:address location="http://localhost:9700/orabpel/default/AmericanLoan"/> </port> </service> <service name="AlliedLoan"> <port name="LoanServicePort" binding="tns:LoanServiceBinding"> <soap:address location="http://localhost:9700/orabpel/default/AlliedLoan"/> </port> </service> <service name="AcmeLoan"> <port name="LoanServicePort" binding="tns:LoanServiceBinding"> <soap:address location="http://localhost:9700/orabpel/default/AcmeLoan"/> </port> </service>
「Webサービス」バインディング・コンポーネントをSOAコンポジット・エディタの「外部参照」スイムレーンにドラッグします。
「Webサービスの作成」ダイアログが表示されます。
Webサービスを定義して、「OK」をクリックします。
完了すると、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プロセスをダブルクリックして、Oracle BPELデザイナを入力します。
assignアクティビティをデザイナにドラッグします。
「コピー・ルール」タブをクリックします。
図8-5に示すように、ターゲット・パートナ・リンクの上にある「XMLフラグメント」アイコンを選択します。BPEL 2.0を使用中の場合は、「リテラル」アイコンをドラッグします。
「XMLフラグメント」アイコンをターゲット・パートナ・リンクにドラッグします。
BPEL 1.1用の「XMLフラグメント」ダイアログが表示されます。BPEL 2.0を使用中の場合は、「リテラル」ダイアログが表示されます。
エンドポイント参照を含むXMLフラグメントをパートナ・リンクに割り当てて、「OK」をクリックします。図8-6に詳細を示します。
完了すると、BPELファイルにはWSDLで定義されたサービスのいずれかが含まれます。
<copy> <from> <EndpointReference xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing"> <Address>http://myhost.us.example.com:9700/orabpel/default/AlliedLoan</Address> </EndpointReference> </from> <to partnerLink="LoanService"/> </copy>
動的パートナ・リンクを使用すると複数のWebサービスと対話できます。この対話には、メッセージを暗号化するために様々なセキュリティ証明書を必要とするメッセージ保護ポリシーの使用が含まれる場合があります。これらの証明書は、Webサービスごとに異なる場合があります。キーストア受信者別名値を指定して、WebサービスのWSDLファイル内のセキュリティ証明書をオーバーライドできます。
パートナ・リンクを起動する際にセキュリティ証明書をオーバーライドする手順は、次のとおりです。
文字列タイプの変数(たとえば、KEYSTORE_RECIPIENT_ALIAS)を定義します。図8-7に詳細を示します。
assignアクティビティの「コピー・ルール」タブで、orakeyを変数KEYSTORE_RECIPIENT_ALIASに割り当てます。図8-8に詳細を示します。
Webサービスのパートナ・リンクを起動するinvokeアクティビティで、「プロパティ」タブをクリックします。
keystore.recipient.aliasプロパティをクリックします。
「値」列をダブルクリックし、「参照」 (...)アイコンを表示します。
「参照」 (...)アイコンをクリックし、「アダプタ・プロパティ値」ダイアログを表示します。
「参照」アイコンをクリックして、「変数XPathビルダー」ダイアログを表示します。
値としてkeystore_recipient_aliasを選択し、「OK」をクリックします。図8-9に詳細を示します。BPELプロセスでWebサービスを起動する際にWSDLファイルに設定されているセキュリティ証明書が、このプロパティによってオーバーライドされます。
図8-9 invokeアクティビティの正規化されたメッセージのプロパティkeystore.recipient.alias
「適用」→「OK」の順にクリックします。
完了すると、BPELファイルは次のように定義されます。
. . . . . . <variables> <variable name="WsaAddress" element="ns6:EndpointReference"/> <variable name="KEYSTORE_RECIPIENT_ALIAS" type="xsd:string"/> </variables> <assign name="AssignAddress"> <copy> <from expression="'http://localhost:8001/soa-infra/services/default/ServiceWithNewCer tificate!1.0*soa_c94537fb-97a4-4b0f-900f-fefffc34f7fe/service_ep'"/> <to variable="WsaAddress" query="/ns6:EndpointReference/ns6:Address"/> </copy> <copy> <from variable="WsaAddress"/> <to partnerLink="Service"/> </copy> </assign> <assign name="AssignAlias"> <copy> <from expression='"orakey"'/> <to variable="KEYSTORE_RECIPIENT_ALIAS"/> </copy> </assign> <invoke name="Invoke" inputVariable="Invoke_InputVariable" partnerLink="Service" portType="ns1:ServiceBPELProcess" operation="process" bpelx:invokeAsDetail="no"> <bpelx:inputProperty name="endpointURI" variable="inputVariable" part="payload" query="/client:process/client:input"/> <bpelx:inputProperty name="keystore.recipient.alias" variable="KEYSTORE_RECIPIENT_ALIAS"/> </invoke>
正規化されたメッセージのプロパティの詳細は、付録H「正規化されたメッセージのプロパティ」を参照してください。
場合によっては、次のような理由によって、動的パートナ・リンクによって使用されるデフォルトWSDLファイルをオーバーライドする必要があります。
メッセージ保護セキュリティ・ポリシーを使用するサービスと統合する必要がある。
WSDLに、メッセージ暗号化に使用される証明書など重要な情報が含まれている可能性がある。
正規化されたメッセージのプロパティendpointWSDLによって、動的パートナ・リンクのWSDLファイルを指定できます。エンドポイントのみでなく、WSDL全体を動的に指定する必要があります。これによって、それをOracle Web Services Manager (Oracle WSM)に渡すことができ、その後、それによって、指定されたWSDLから適切なサービス証明書を取得できます。
WSDLファイル内の証明書は、次の場合には無視されます。
第8.6項「動的パートナ・リンクを起動する際のセキュリティ証明書のオーバーライド」に記載されているrecipient.key.aliasプロパティ名が存在している。
endpointWSDLプロパティが存在していない。
それ以外の場合、証明書はWSDLファイルから取得されます。
動的パートナ・リンクのWSDLファイルをオーバーライドする手順は、次のとおりです。
文字列タイプの変数を定義します(この例では、the_wsdl_var
が定義されます)。
assignアクティビティの「コピー・ルール」タブで、WSDLを変数the_wsdl_varに割り当てます。
パートナ・リンクを起動するinvokeアクティビティで、「プロパティ」タブをクリックします。
endpointWSDLプロパティをクリックします。
「値」列をダブルクリックし、「参照」 (...)アイコンを表示します。
「参照」 (...)アイコンをクリックし、「アダプタ・プロパティ値」ダイアログを表示します。
「参照」アイコンをクリックして、「変数XPathビルダー」ダイアログを表示します。
変数としてthe_wsdl_varを選択し、「OK」をクリックします。この値によって、動的パートナ・リンクのWSDLが指定されます。図8-10に詳細を示します。
図8-10 invokeアクティビティの正規化されたメッセージのプロパティendpointWSDL
完了すると、BPELファイルは次のように定義されます。
<variables> <variable name="the_wsdl_var" type="xsd:string"/> </variables> <assign name="myAssignWsdl"> <copy> <from expression='"http://localhost:8001/soa-infra/services/default/ServiceWithNewCer tificate!1.0/service_ep?WSDL"'/> <to variable="the_wsdl_var"/> </copy> </assign> <invoke name="Invoke" inputVariable="Invoke_InputVariable" partnerLink="Service" portType="ns1:ServiceBPELProcess" operation="process" bpelx:invokeAsDetail="no"> <bpelx:inputProperty name="endpointWSDL" variable="the_wsdl_var"/> </invoke>
正規化されたメッセージのプロパティの詳細は、付録H「正規化されたメッセージのプロパティ」を参照してください。
ある時点でアクティブなインスタンスは多数存在する可能性があるため、サーバーはWebサービス・レスポンスに、対応する適切なBPELプロセス・サービス・コンポーネント・インスタンスを指示する必要があります。WS-Addressingを使用すると、非同期メッセージを識別して、非同期コールバックが確実に適切なクライアントを特定できるようにすることができます。
図8-11に、WS-Addressingの概要を示します。WS-Addressingは、非同期メッセージの相関にSimple Object Access Protocol(SOAP)ヘッダーを使用します。メッセージは、使用されるトランスポートまたはアプリケーションに依存しません。
図8-11は、レスポンスが正しい宛先に送信されるように、メッセージがWSヘッダーとともに渡される様子を示しています。
この章の例では、相関にWS-Addressingを使用しています。メッセージの表示には、TCPトンネリングを使用できます。これについては、第8.8.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メッセージを表示することもできます。