この章では、BPELプロセスから同期Webサービスを起動する方法について説明します。同期起動の実行に必要なコンポーネントの設定方法についても提示します。また、この章では、これらのコンポーネントのコーデイングの方法についても説明します。
項目は次のとおりです。
入力文字列が使用され、「Hello
」という接頭辞を追加した文字列を返す単純なHello Worldサンプル(bpel-101-HelloWorld
)を参照する場合は、次のURLにアクセスしてください。
https://soasamples.samplecode.oracle.com/
同期Webサービスは、起動に対してレスポンスを即時に返します。BPELは、パートナ・リンクを介して同期Webサービスに接続し、データを送信し、同一の同期起動でリプライを受信できます。
同期起動には、次のコンポーネントが必要です。
パートナ・リンク
タスクを実行するためにBPELプロセス・サービス・コンポーネントが接続するWebサービスの場所とロールを定義し、WebサービスとBPELプロセス・サービス・コンポーネントの間で情報を受け渡すための変数を定義します。パートナ・リンクは、BPELプロセス・サービス・コンポーネントがコールする各Webサービスに対して必要です。パートナ・リンクは次のいずれかの方法で作成できます。
Webサービスを「コンポーネント・パレット」の「サービス・アダプタ」セクションから「公開されたサービス」または「外部参照」スイムレーンにドラッグする場合は、SOAコンポジット・エディタで作成します。詳細は、第2.3項「サービス・バインディング・コンポーネントの追加」または第2.4項「参照バインディング・コンポーネントの追加」を参照してください。
パートナ・リンクを「コンポーネント・パレット」の「BPELコンストラクト」セクションから「パートナ・リンク」スイムレーンにドラッグする場合は、Oracle BPELデザイナで作成します。この章では、この方法について説明します。
invokeアクティビティ
データを送受信するためのポートを、BPELプロセス・サービス・コンポーネント内でオープンします。たとえば、このポートは、クレジット・カード認可サービスを使用して顧客の与信が受諾可能であることを検証する情報の取得に使用します。同期コールバックの場合、関数の送受信に必要なポートは1つのみです。
この項では同期起動操作について説明します。WebLogic Fusion Order DemoアプリケーションのOrderProcessor.bpel
ファイルを例として使用します。
同期Webサービスを起動する手順は、次のとおりです。
Oracle BPELデザイナの「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。
必要なパートナ・リンク、invokeアクティビティ、scopeアクティビティおよびassignアクティビティをデザイナにドラッグします。
それぞれのダイアログを編集します。
図7-1 は、Fusion Order DemoのOrderProcessor.bpelファイルの「Scope_AuthorizeCreditCard」scopeアクティビティのダイアグラムを示しています。単純な一連のアクションが定義されています。
次のアクションを実行します。
「Assign_CreditCheckInput」assignアクティビティは、クライアントからのデータをパッケージ化します。assignアクティビティを使用すると、ある変数の内容を別の変数にコピーできます。ここでは、クレジット・カード・タイプ、クレジット・カード番号および購入金額を取得し、それらを「CreditAuthorizationService」サービスの入力変数に割り当てます。
「InvokeCheckCreditCard」アクティビティは、「CreditCardAuthorization」サービスをコールします。図7-2は、「CreditCardAuthorizationService」Webサービスを示しています。このWebサービスはパートナ・リンクとして定義されています。
図7-3は、「InvokeCheckCreditCard」invokeアクティビティを示しています。
図7-1の「Switch_EvaluateCCResult」switchアクティビティは、クレジット・カード検証の結果を確認します。switchアクティビティの詳細は、第10.2.1項「BPEL 1.1のswitchアクティビティの作成による条件分岐の定義」を参照してください。
パートナ・リンクとinvokeアクティビティを作成すると、同期Webサービスの起動に必要なBPELコードが、適切なBPELおよびWeb Services Description Language(WSDL)ファイルに追加されます。
OrderProcessor.bpel
コードでは、パートナ・リンクによって、リンク名とタイプ、およびパートナ・サービスとの相互作用におけるBPELプロセス・サービス・コンポーネントのロールが定義されます。
例7-1は、BPELソース・コードでのCreditCardAuthorizationService
パートナ・リンク定義を示しています。
例7-1 パートナ・リンク定義
<partnerLink name="CreditCardAuthorizationService" partnerRole="CreditAuthorizationPort" partnerLinkType="ns2:CreditCardAuthorizationService"/>
例7-2は、Scope_AuthorizeCreditCard
スコープでローカルにアクセスできる変数定義を示しています。これらの変数のタイプは、このプロセス自体のWSDLに定義されています。
例7-2 変数定義
<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
が、クレジット・カード・タイプ、クレジット・カード番号および購入金額を受信し、信用調査結果を返します。
例7-3に、partnerLinkType
およびportType
の例を示します。
invokeアクティビティには、lCreditCardInput
ローカル入力変数が含まれています。クレジット・カード認可WebサービスがlCreditCardInput
ローカル入力変数を使用します。この変数には、顧客のクレジット・カード・タイプ、クレジット・カード番号および購入金額が格納されます。lCreditCardOutput
変数は、CreditAuthorizationService
からの信用調査結果を返します。例7-4に例を示します。
例7-5に示すBPELコードは、同期起動を実行します。
例7-5 同期起動
<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プロパティを使用してタイムアウト値を指定できます。このプロパティは、リクエストおよびレスポンス操作がタイムアウトになる前に確保しておく最大時間を定義します。BPELプロセス・サービス・コンポーネントが指定時間内にリプライを受信しないと、アクティビティはエラーとなります。
タイムアウト値を指定する手順は、次のとおりです。
Oracle Enterprise Manager Fusion Middleware Controlにログインします。
「SOAインフラストラクチャ」メニューから、「SOA管理」→「BPELプロパティ」の順に選択します。
「BPELサービス・エンジン・プロパティ」ページの下部で、「詳細BPEL構成プロパティ」をクリックします。
SyncMaxWaitTimeをクリックします。
「値」フィールドに値を秒単位で指定します。
「適用」をクリックします。
「戻る」をクリックします。
SyncMaxWaitTimeプロパティは、非同期の方法でコールされる永続プロセスに適用されます。
例7-6に示す定義がBPELプロセスに存在していると仮定します。このプロセスは、breakpointアクティビティがないため、永続プロセスではありません。
例7-6 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は最後のアクティビティであるため、スレッドがクライアント側に戻り、リプライ・メッセージの取得が試みられます。リプライ・メッセージはすでに挿入されているため、クライアントは待機せずにリプライで戻ります。
例7-7に示すように、BPELプロセスにbreakpointアクティビティがあると仮定します。
例7-7 breakpointアクティビティがあるプロセス
<receive name="receiveInput" partnerLink="client" variable="input" createInstance="yes" /> <assign> ... </assign> <wait for="'PT10S'" /> <reply name="replyOutput" partnerLink="client" variable="output" />
同期プロセス内部に非同期のアクティビティが存在することは適切ではありませんが、BPELではこの種の設計が禁止されていません。
クライアント(または別のBPELプロセス)がプロセスをコールすると、wait(breakpoint)アクティビティが実行されます。ただし、waitはいくらかの時間が経過した後に非同期スレッドによってバックグラウンドで処理されるため、スレッドの実行はクライアント側に戻ります。クライアント(実際には配信サービス)はリプライ・メッセージの取得を試みますが、プロセス内のリプライ・アクティビティはその時点では実行されていないため、メッセージは存在しません。したがって、クライアント・スレッドはSyncMaxWaitTime値(秒数)に指定されている時間が経過するまで待機します。この時間を超えると、クライアント・スレッドはコール元にタイムアウト例外を返します。待機時間がSyncMaxWaitTime値未満の場合は、非同期のバックグラウンド・スレッドが待機状態から再開し、リプライを実行します。リプライはHashMapに配置され、待機側(クライアント・スレッド)に通知されます。クライアント・スレッドは、リプライ・メッセージを取得して戻ります。
したがって、プロセスの中ほどにブレークポイントがある場合は、同期プロセスの起動にのみSyncMaxWaitTimeが適用されます。ブレークポイントがない場合は、プロセス全体がクライアント・スレッドで実行され、リプライ・メッセージを返します。
非同期コールバックを使用してバック・エンドで同期リプライをシミュレートしながら、フロント・エンドで同期インタフェースを公開できます。これは、composite.xml
ファイルのconfiguration.transaction
プロパティがrequiresNew
に自動設定されている場合のBPELプロセスのデフォルト動作です。例7-8に詳細を示します。
例7-8 configuration.transactionプロパティ
<component name="BPELProcess1">
@ <implementation.bpel src="BPELProcess1.bpel"/>
@ <property name="configuration.transaction" type="xs:string"
@ many="false">requiresNew</property>
@ </component>
requiresNew
は推奨値です。クライアントのトランザクションに参加する場合は、configuration.transaction
プロパティをRequired
に設定する必要があります。