この章の内容は次のとおりです。
同期Webサービスは、起動に対してレスポンスを即時に返します。BPELは、パートナ・リンクを介して同期Webサービスに接続し、データを送信し、同一の同期起動でリプライを受信できます。
同期起動には、次のコンポーネントが必要です。
パートナ・リンク
タスクを実行するためにBPELプロセス・サービス・コンポーネントが接続するWebサービスの場所とロールを定義し、WebサービスとBPELプロセス・サービス・コンポーネントの間で情報を受け渡すための変数を定義します。パートナ・リンクは、BPELプロセス・サービス・コンポーネントがコールする各Webサービスに対して必要です。パートナ・リンクは次のいずれかの方法で作成できます。
SOAコンポジット・エディタで、「SOAP」サービスを「コンポーネント」ウィンドウの「テクノロジ」セクションから「公開されたサービス」または「外部参照」のスイムレーンにドラッグした場合。詳細は、「サービス・バインディング・コンポーネントの追加」または「参照バインディング・コンポーネントの追加」を参照してください。
Oracle BPELデザイナで、「パートナ・リンク」アイコンを「コンポーネント」ウィンドウの「BPELコンストラクト」セクションから「パートナ・リンク」スイムレーンにドラッグした場合。この章では、この2番目の方法について説明します。
invokeアクティビティ
データを送受信するためのポートを、BPELプロセス・サービス・コンポーネント内でオープンします。たとえば、このポートは、クレジット・カード認可サービスを使用して顧客の与信が受諾可能であることを検証する情報の取得に使用します。同期コールバックの場合、関数の送受信に必要なポートは1つのみです。
名前がOrderProcessor.bpelであるファイルを使用する同期起動操作についてこの項で説明します。
同期Webサービスを起動する手順は、次のとおりです。
次のアクションが実行されます。
「Assign_CreditCardCheckInput」 assignアクティビティによって、クライアントからのデータがパッケージ化されます。assignアクティビティを使用すると、ある変数の内容を別の変数にコピーできます。ここでは、クレジット・カード・タイプ、クレジット・カード番号および購入金額を取得し、それらを「CreditCardAuthorizationService」サービスの入力変数に代入します。
「InvokeCheckCreditCard」 invokeアクティビティによって「CreditCardAuthorizationService」サービスがコールされます。図7-2は、「CreditCardAuthorizationService」Webサービスを示しています。このWebサービスはパートナ・リンクとして定義されています。
図7-3は、「InvokeCheckCreditCard」invokeアクティビティを示しています。
ifアクティビティ(BPEL 2.0)またはswitchアクティビティ(BPEL 1.1)は、クレジット・カード検証の結果を確認します。ifアクティビティおよびswitchアクティビティの詳細は、「ifまたはswitchアクティビティによる条件分岐の定義」を参照してください。
注意:
BPEL 2.0のifアクティビティは、BPEL 1.1のswitchアクティビティにかわるものです。
パートナ・リンクとinvokeアクティビティを作成すると、同期Webサービスの起動に必要なBPELコードが、適切なBPELおよびWeb Services Description Language (WSDL)ファイルに追加されます。
OrderProcessor.bpelコードでは、パートナ・リンクによって、リンク名とタイプ、およびパートナ・サービスとの相互作用におけるBPELプロセス・サービス・コンポーネントのロールが定義されます。
次に、BPELソース・コードでのCreditCardAuthorizationServiceパートナ・リンク定義を示します。
<partnerLink name="CreditCardAuthorizationService"
partnerRole="CreditAuthorizationPort"
partnerLinkType="ns2:CreditCardAuthorizationService"/>
次の例は、Scope_AuthorizeCreditCardスコープでローカルにアクセスできる変数定義を示しています。これらの変数のタイプは、このプロセス自体のWSDLに定義されています。
<variable name="lCreditCardInput"
messageType="ns2:CreditAuthorizationRequestMessage"/>
<variable name="lCreditCardOutput"
messageType="ns2:CreditAuthorizationResponseMessage"/>
WSDLファイルによって、次のようなBPELプロセス・サービス・コンポーネントのインタフェースが定義されます。
それが受け付けるメッセージと返すメッセージ
サポートされている操作
その他のパラメータ
WebサービスのCreditCardAuthorizationService.wsdlファイルには、2つのセクションがあります。これらのセクションを使用して、WebサービスとBPELプロセス・サービス・コンポーネントの連携を可能にします。
partnerLinkType:
BPELプロセス・サービス・コンポーネントとクレジット・カード認可Webサービス間の変換について、次の特性を定義します。
それぞれが果たすロール(操作)
対話でメッセージを受信するためにそれぞれが提供するportType
portType:
対話内で参加者によって実装される一連の関連操作です。ポート・タイプは、受渡しする情報や、その情報の形式などを定義します。同期起動には、同期プロセスの起動およびレスポンスでのクライアントのコールバックを実行する1つのポート・タイプのみが必要です。非同期コールバック(リプライが即時に行われないもの)には、次の2つのポート・タイプが必要です。
1つは、リクエストを送信するため。
もう1つは、リプライが着信したときに、それを受信するため。
この例では、portType CreditAuthorizationPortが、クレジット・カード・タイプ、クレジット・カード番号および購入金額を受信し、信用調査結果を返します。
次に、partnerLinkTypeおよびportTypeの例を示します。
<plnk:partnerLinkType name="CreditCardAuthorizationService">
<plnk:role name="CreditAuthorizationPort">
<plnk:portType name="tns:CreditAuthorizationPort"/>
</plnk:role>
</plnk:partnerLinkType>
invokeアクティビティには、lCreditCardInputローカル入力変数が含まれています。クレジット・カード認可WebサービスがlCreditCardInputローカル入力変数を使用します。この変数には、顧客のクレジット・カード・タイプ、クレジット・カード番号および購入金額が格納されます。lCreditCardOutput変数は、CreditCardAuthorizationServiceサービスからの信用調査結果を返します。次の例に詳細を示します。
<invoke name="InvokeCheckCreditCard"
inputVariable="lCreditCardInput"
outputVariable="lCreditCardOutput"
partnerLink="CreditCardAuthorizationService"
portType="ns2:CreditAuthorizationPort"
operation="AuthorizeCredit"/>
次の例に示すBPELコードは、同期起動を実行します。
<assign name="Assign_CreditCheckInput">
<copy>
<from variable="gOrderInfoVariable"
query="/ns4:orderInfoVOSDO/ns4:OrderTotal"/>
<to variable="lCreditCardInput" part="Authorization"
query="/ns8:AuthInformation/ns8:PurchaseAmount"/>
</copy>
<copy>
<from variable="gOrderInfoVariable"
query="/ns4:orderInfoVOSDO/ns4:CardTypeCode"/>
<to variable="lCreditCardInput" part="Authorization"
query="/ns8:AuthInformation/ns8:CCType"/>
</copy>
<copy>
<from variable="gOrderInfoVariable"
query="/ns4:orderInfoVOSDO/ns4:AccountNumber"/>
<to variable="lCreditCardInput" part="Authorization"
query="/ns8:AuthInformation/ns8:CCNumber"/>
</copy>
</assign>
<invoke name="InvokeCheckCreditCard"
inputVariable="lCreditCardInput"
outputVariable="lCreditCardOutput"
partnerLink="CreditCardAuthorizationService"
portType="ns2:CreditAuthorizationPort"
operation="AuthorizeCredit"/>
Oracle Enterprise Manager Fusion Middleware ControlのシステムMBeanブラウザで、SyncMaxWaitTimeプロパティを使用して、トランザクションのタイムアウト値を指定できます。SyncMaxWaitTimeプロパティは、非同期方式でコールされる永続同期プロセスに適用されます。BPELプロセス・サービス・コンポーネントが指定時間内にリプライを受信しないと、アクティビティはエラーとなります。詳細は、「SyncMaxWaitTimeとタイムアウトのない永続同期リクエストに関する必知事項」を参照してください。
トランザクションのタイムアウト値を指定する手順は、次のとおりです。
SyncMaxWaitTimeプロパティは、非同期方式でコールされる永続同期プロセスに適用されます。
次の例に示す定義がBPELプロセスに存在していると仮定します。このプロセスは、breakpointアクティビティがないため、永続プロセスではありません。
<receive name="receiveInput" partnerLink="client" variable="input" createInstance="yes" /> <assign> ... </assign> <reply name="replyOutput" partnerLink="client" variable="output" />
Javaクライアントまたは別のBPELプロセスがこのプロセスをコールすると、assignアクティビティが実行され、replyアクティビティによって出力メッセージがHashMapに設定され、クライアント(実際には配信サービス)が取得できるようになります。replyは最後のアクティビティであるため、スレッドがクライアント側に戻り、リプライ・メッセージの取得が試みられます。リプライ・メッセージはすでに挿入されているため、クライアントは待機せずにリプライで戻ります。
次の例に示すように、BPELプロセスにbreakpointアクティビティがあると仮定します。
<receive name="receiveInput" partnerLink="client" variable="input"
createInstance="yes" />
<assign>
...
</assign>
<wait name="Wait1">
<for>'PT10S'</for>
</wait>
<reply name="replyOutput" partnerLink="client" variable="output" />
同期プロセス内部に非同期のアクティビティが存在することは適切ではありませんが、BPELではこの種の設計が禁止されていません。
クライアント(または別のBPELプロセス)がプロセスをコールすると、wait (breakpoint)アクティビティが実行されます。ただし、waitはいくらかの時間が経過した後に非同期スレッドによってバックグラウンドで処理されるため、スレッドの実行はクライアント側に戻ります。クライアント(実際には配信サービス)はリプライ・メッセージの取得を試みますが、プロセス内のリプライ・アクティビティはその時点では実行されていないため、メッセージは存在しません。したがって、クライアント・スレッドはSyncMaxWaitTime値(秒数)に指定されている時間が経過するまで待機します。この時間を超えると、クライアント・スレッドはコール元にタイムアウト例外を返します。待機時間がSyncMaxWaitTime値未満の場合は、非同期のバックグラウンド・スレッドが待機状態から再開し、リプライを実行します。リプライはHashMapに配置され、待機側(クライアント・スレッド)に通知されます。クライアント・スレッドは、リプライ・メッセージを取得して戻ります。
したがって、プロセスの中ほどにブレークポイントがある場合は、同期プロセスの起動にのみSyncMaxWaitTimeが適用されます。ブレークポイントがない場合は、プロセス全体がクライアント・スレッドで実行され、リプライ・メッセージを返します。
非同期コールバックを使用してバック・エンドで同期リプライをシミュレートしながら、フロント・エンドで同期インタフェースを公開できます。これは、composite.xmlファイルのbpel.config.transactionプロパティがrequiresNewに自動設定されている場合のBPELプロセスのデフォルト動作です。次の例に詳細を示します。
<component name="BPELProcess1">
<implementation.bpel src="BPELProcess1.bpel"/>
<property name="bpel.config.transaction" type="xs:string"
many="false">requiresNew</property>
</component>
requiresNew値をお薦めします。クライアントのトランザクションに参加する場合は、bpel.config.transactionプロパティをrequiredに設定する必要があります。