[SOA/BPM] Invoking web services dynamically in BPEL 1.1

このトピックを扱った記事はたくさんありますが、今回はSOA/BPM Suite 11gR1 PS4 (11.1.1.5) とJDeveloper 11.1.1.5の例でご紹介します。

Webサービスをwell-knownなエンドポイント経由で実行する前に、このテクニックの重要な制限事項を理解しておく必要があります。各Webサービスには設計時に定義されたメッセージ、ポート、名前空間を持っていますが、異なるエンドポイントにあるサービスを実行時に指定して起動することができる、ということです。

この説明では、以下の手順に従って開発し、動作確認していきます。
今回は2個のサービスを作成します。
  1. Webサービスのメッセージ構造を定義する
  2. Webサービスを実装、デプロイする
  3. サービスを必要なだけ複製する
今回のサービスで利用するメッセージの定義は以下の通りです。
<?xml version="1.0" encoding="windows-1252" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="http://www.oracle.com/ateam/dynamic"
            targetNamespace="http://www.oracle.com/ateam/dynamic"
            elementFormDefault="qualified">
  <xsd:element name="input">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Endpoint" type="xsd:string"/>
        <xsd:element name="parameter" type="xsd:string"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="output">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="parameter" type="xsd:string"/>
        <xsd:element name="status" type="xsd:string"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
この例では、入力メッセージにエンドポイントが含まれており、サービスが起動元に対してEchoを返すための任意の値が含まれています。出力メッセージには、Echoされた値と、サービス独自のステータス情報が入ります。

それでは開発を始めましょう。
JDeveloperで新規SOAアプリケーションを作成します。名前はATeamDynamicとし、アプリケーションパッケージの接頭辞は適宜設定しましょう。
プロジェクト名はService_1とし、空のコンポジットからスタートします。
プロジェクトのxsdフォルダ内にcommon.xsdというXMLスキーマ定義を作成します。名前空間の定義はxsdスタブを上書きするので気にする必要はありません。

上記のXMLでスキーマを作成します。また、ドライバのプロセスでエンドポイント要素のみに意味がある(すなわち、サービス自体が使用しない)にもかかわらず、簡潔にするために、サービスと"ドライバ"の両方にこのスキーマを使用することに注意してください。

BPELプロセスをコンポジットキャンバスにドラッグします。このとき、以下の点を確認、指定します。
  • BPEL 1.1であることを確認
  • BPELアクティビティの名前はProcess
  • 名前空間は http://xmlns.oracle.com/ATeamDynamic/Service/Process
  • 同期プロセスを選択(Dynamic Bindingには同期プロセスが必須ではありませんが、非同期プロセスの場合はドライバを作り替える必要があります)
  • サービス名は process_client
  • SOAPサービスとして公開
  • 先ほど作成したスキーマで、入力メッセージ、出力メッセージを作成
BPELアクティビティをダブルクリックして、BPELデザイナに入ります。
AssignアクティビティをBPELデザインキャンバス中のReceive、Replyアクティビティの間に配置し、Assignアクティビティをダブルクリックして以下のように設定しましょう。


echo backするようにparamaterをService_1のparameterにコピーし、statusを追加したら、プロジェクトをデプロイし、Enterprise ManagerからこのWebサービスが正常に動作することを確認しましょう。ただ、テストのために、エンドポイントが必要です。

次に、2個目のサービスを作成しましょう。JDeveloperで、新しいService_2というSOAプロジェクトを作成します。設定内容はService_1と全く同様にします。スキーマも新たに作成せず、既に作成したものを使います。Assignアクティビティでは、"Service 2"をstatusに設定するほかは、Service_1と全く同じことを実施します。

では、お待ちかねのDynamic Driverに入ります。

DynamicDriverという新しいSOAプロジェクトを作成し、空のコンポジットからスタートします。BPELプロセスをキャンバスに配置し、名前、名前空間は適宜指定します。テストのことを考慮し、同期プロセスでプロセスを作成します。このプロセスもSOAPサービスとして公開し、common.xsdを使う同じ入出力メッセージにします。

BPELプロセスをダブルクリックします。パートナーリンクを右側のスイムレーンに配置し、適当な名前を付けます。事前にデプロイしたサービスのWSDLが必要なので、パートナーリンク構成ウィザードで、WSDL URLを指定します。WSDLのURLは、Enterprise ManagerのService_1のテストページ(別にService_2でもかまいません)での確認が一番簡単です。テストページで、以下のようなWSDLクエリURLを確認できると思います。
http://<hostname>:7001/soa-infra/services/default/Service_1/process_client_ep?WSDL
WSDLのURLをコピーし、構成ウィザードのページに貼り付けます。パートナーリンクタイプをクリックすると、Processと表示されるはずです。パートナーロールをクリックして、ProcessProviderを選択し、OKを押します(マイロールは指定しないで下さい)。

InvokeアクティビティをキャンバスのReceiveとReplyの間に配置し、パートナーリンクとInvokeアクティビティをつなぎ、入出力の変数を作成します(簡単のため、一般的な名前にしておきました)。

新しいスキーマ定義をDynamicDriverプロジェクトのxsdフォルダ中に作成します。ファイル名はws-addressing.xsdとします。Webブラウザで http://schemas.xmlsoap.org/ws/2003/03/addressing/ を表示し、新しく作成したws-addressing.xsdにコピー&ペーストします。

BPELエディタに戻り、新しい変数(EndpointReference)を作成します。要素のラジオボタンをクリックしてws-addressingスキーマ中のEndpointReference要素を確認しましょう。

AssignアクティビティをInvokeの前に配置します。Assignアクティビティ中で、3件コピーするように設定します。
まず、XMLフラグメントを、変数EndpointReferenceにコピーします。
<EndpointReference 
  xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing"
  xmlns:ns1="http://xmlns.oracle.com/AteamDynamic/Service/Process">
    <Address/>
    <ServiceName>ns1:process_client_ep</ServiceName>
</EndpointReference>
[注意]
ns1という名前空間とService_Nameはここで記載した命名規約に従います。

入力変数中のEndpointをコピーして、EndpointReferenceのAddressにコピーします。
続いて、PartnerLinkを設定するために、以下のようにEndpointReferenceをPartnerLinkにコピーします。

通常と異なり、ソース画面で読む方がわかりやすいかもしれません。


[注意]
デプロイ(ビルド)時に、型の不一致が原因で、2番目のコピーで警告が出るかもしれませんが、無視して問題ありません。
それでは、Webサービスのペイロードに値を設定しましょう。


Webサービスはエンドポイントの値を使いませんが、スキーマにはこの要素が必須なので、何かをコピーしておく必要があります。起動後、このようにWebサービスの応答を得ることにしましょう。


ようやくDynamicDriverプロジェクトをデプロイし、テストできるようになりました。
Enterprise ManagerからService_1プロジェクトのテストタブを選択すると、このサービスのエンドポイントURLを確認できると思いますので、このURLをコピーしましょう。
では、テストを開始します。Service_1のURLをエンドポイントのフィールドに貼り付け、Webサービスのテストを実行します。成功していれば、正しいWebサービスが呼び出されたことを示すService_1のステータスとエコーバックされた値を確認できるはずです。同じように、Service_2のテストを繰り返しましょう。

完全なアプリケーションはこちらからダウンロードできます。


原文はこちら。
http://blogs.oracle.com/ateamsoab2b/entry/invoking_web_services_dynamically_in

0 件のコメント:

コメントを投稿