ヘッダーをスキップ
Oracle® Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.7)
B56238-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

7 BPELプロセスからの同期Webサービスの起動

この章では、BPELプロセスから同期Webサービスを起動する方法について説明します。ここでは、同期起動の実行に必要なコンポーネントの設定方法、およびこれらのコンポーネントのコード方法についても示します。また、タイムアウト値を指定し、同期BPELプロセスを使用して、一方向のOracle Mediatorをコールする方法についても説明します。

この章には次の項が含まれます:

入力文字列が使用され、Helloという接頭辞を追加した文字列を返す単純なHello Worldサンプル(bpel-101-HelloWorld)については、Oracle SOA Suiteサンプルを参照してください。

7.1 同期Webサービスの起動に関する概要

同期Webサービスは、起動に対してレスポンスを即時に返します。BPELは、パートナ・リンクを介して同期Webサービスに接続し、データを送信し、同一の同期起動でリプライを受信できます。

同期起動には、次のコンポーネントが必要です。

7.2 同期Webサービスの起動

この項では同期起動操作について説明します。WebLogic Fusion Order DemoアプリケーションのOrderProcessor.bpelファイルを例として使用します。

7.2.1 同期Webサービスの起動方法

同期Webサービスを起動する手順は、次のとおりです。

  1. Oracle BPELデザイナの「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  2. 必要なパートナ・リンク、invokeアクティビティ、scopeアクティビティおよびassignアクティビティをデザイナにドラッグします。

  3. それぞれのダイアログを編集します。

    図7-1 は、Fusion Order DemoのOrderProcessor.bpelファイルの「Scope_AuthorizeCreditCard」scopeアクティビティのダイアグラムを示しています。単純な一連のアクションが定義されています。

    図7-1 OrderProcessor.bpelのダイアグラム

    図7-1の説明が続きます
    「図7-1 OrderProcessor.bpelのダイアグラム」の説明

次のアクションを実行します。

  1. 「Assign_CreditCardCheckInput」 assignアクティビティによって、クライアントからのデータがパッケージ化されます。assignアクティビティを使用すると、ある変数の内容を別の変数にコピーできます。ここでは、クレジット・カード・タイプ、クレジット・カード番号および購入金額を取得し、それらを「CreditCardAuthorizationService」サービスの入力変数に代入します。

  2. 「InvokeCheckCreditCard」 invokeアクティビティによって「CreditCardAuthorizationService」サービスがコールされます。図7-2は、「CreditCardAuthorizationService」Webサービスを示しています。このWebサービスはパートナ・リンクとして定義されています。

    図7-2 「CreditCardAuthorizationService」パートナ・リンク

    図7-2の説明が続きます
    「図7-2 「CreditCardAuthorizationService」パートナ・リンク」の説明

    図7-3は、「InvokeCheckCreditCard」invokeアクティビティを示しています。

    図7-3 「InvokeCheckCreditCard」invokeアクティビティ

    図7-3の説明が続きます
    「図7-3 「InvokeCheckCreditCard」invokeアクティビティ」の説明

  3. 図7-1「Switch_EvaluateCCResult」switchアクティビティは、クレジット・カード検証の結果を確認します。switchアクティビティの詳細は、第11.2.1項「BPEL 1.1のswitchアクティビティの作成による条件分岐の定義」を参照してください。


    注意:

    switchアクティビティは、BPEL 2.0のifアクティビティに置き換えられました。


7.2.2 同期Webサービス起動時の処理内容

パートナ・リンクとinvokeアクティビティを作成すると、同期Webサービスの起動に必要なBPELコードが、適切なBPELおよびWeb Services Description Language(WSDL)ファイルに追加されます。

7.2.2.1 BPELコード内のパートナ・リンク

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プロセス・サービス・コンポーネントのインタフェースが定義されます。

  • それが受け付けるメッセージと返すメッセージ

  • サポートされている操作

  • その他のパラメータ

7.2.2.2 BPELコード内のパートナ・リンク・タイプとポート・タイプ

WebサービスのCreditCardAuthorizationService.wsdlファイルには、2つのセクションがあります。これらのセクションを使用して、WebサービスとBPELプロセス・サービス・コンポーネントの連携を可能にします。

  • partnerLinkType:

    BPELプロセス・サービス・コンポーネントとクレジット・カード認可Webサービス間の変換について、次の特性を定義します。

    • それぞれが果たすロール(操作)

    • 対話でメッセージを受信するためにそれぞれが提供するportType

  • portType:

    対話内で参加者によって実装される一連の関連操作です。ポート・タイプは、受渡しする情報や、その情報の形式などを定義します。同期起動には、同期プロセスの起動およびレスポンスでのクライアントのコールバックを実行する1つのポート・タイプのみが必要です。非同期コールバック(リプライが即時に行われないもの)には、次の2つのポート・タイプが必要です。

    • 1つは、リクエストを送信するため。

    • もう1つは、リプライが着信したときに、それを受信するため。

    この例では、portType CreditAuthorizationPortが、クレジット・カード・タイプ、クレジット・カード番号および購入金額を受信し、信用調査結果を返します。

    例7-3に、partnerLinkTypeおよびportTypeの例を示します。

    例7-3 partnerLinkTypeおよびportTypeの定義

    <plnk:partnerLinkType name="CreditCardAuthorizationService">
         <plnk:role name="CreditAuthorizationPort">
             <plnk:portType name="tns:CreditAuthorizationPort"/>
         </plnk:role>
    </plnk:partnerLinkType>
    

7.2.2.3 リクエストを実行するためのinvokeアクティビティ

invokeアクティビティには、lCreditCardInputローカル入力変数が含まれています。クレジット・カード認可WebサービスがlCreditCardInputローカル入力変数を使用します。この変数には、顧客のクレジット・カード・タイプ、クレジット・カード番号および購入金額が格納されます。lCreditCardOutput変数は、CreditCardAuthorizationServiceサービスからの信用調査結果を返します。例7-4に詳細を示します。

例7-4 invokeアクティビティ

<invoke name="InvokeCheckCreditCard"
    inputVariable="lCreditCardInput"
    outputVariable="lCreditCardOutput"
    partnerLink="CreditCardAuthorizationService"
    portType="ns2:CreditAuthorizationPort"
    operation="AuthorizeCredit"/>

7.2.2.4 BPELコードでの同期起動

例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"/>

詳細は、第3章「SOAサンプル・アプリケーションの概要」を参照してください。

7.3 永続同期プロセスのトランザクションのタイムアウト値の指定

Oracle Enterprise Manager Fusion Middleware ControlのシステムMBeanブラウザで、SyncMaxWaitTimeプロパティを使用して、トランザクションのタイムアウト値を指定できます。SyncMaxWaitTimeプロパティは、非同期方式でコールされる永続同期プロセスに適用されます。BPELプロセス・サービス・コンポーネントが指定時間内にリプライを受信しないと、アクティビティはエラーとなります。詳細は、第7.3.2項「SyncMaxWaitTimeとタイムアウトのない永続同期リクエストに関する注意事項」を参照してください。

7.3.1 トランザクションのタイムアウト値の指定方法

トランザクションのタイムアウト値を指定する手順は、次のとおりです。

  1. Oracle Enterprise Manager Fusion Middleware Controlにログインします。

  2. 「SOAインフラストラクチャ」メニューから、「SOA管理」「BPELプロパティ」の順に選択します。

  3. 「BPELサービス・エンジン・プロパティ」ページの下部で、「詳細BPEL構成プロパティ」をクリックします。

  4. SyncMaxWaitTimeをクリックします。

  5. 「値」フィールドに値を秒単位で指定します。

  6. 「適用」をクリックします。

  7. 「戻る」をクリックします。

7.3.2 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が適用されます。ブレークポイントがない場合は、プロセス全体がクライアント・スレッドで実行され、リプライ・メッセージを返します。

7.4 同期BPELプロセスを使用した一方向メディエータのコール

非同期コールバックを使用してバック・エンドで同期リプライをシミュレートしながら、フロント・エンドで同期インタフェースを公開できます。これは、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に設定する必要があります。