プライマリ・コンテンツに移動
Oracle® Fusion Middlewareテクノロジ・アダプタの理解
12c (12.2.1.3.0)
E90274-03
目次へ移動
目次

前
次

5 ソケット用のOracle JCAアダプタ

ここでは、外部サービスとしてOracle BPEL Process Manager (Oracle BPEL PM)およびOracle Mediator (メディエータ)で動作する、Oracle JCA Adapter for Sockets (Oracleソケット・アダプタ)の使用方法を学びます。

5.1 Oracleソケット・アダプタの概要

Oracleソケット・アダプタはJCA 1.5準拠のアダプタであり、TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化に使用されます。Oracleソケット・アダプタを使用すると、クライアントまたはサーバー・ソケットの作成や、接続の確立が可能です。テキストまたはバイナリのデータを転送できます。

5.1.1 Oracleソケット・アダプタのアーキテクチャ

Oracleソケット・アダプタは、JCA 1.5アーキテクチャに基づいています。JCAでは、異機種間のエンタープライズ情報システム(EIS)の統合に標準アーキテクチャを提供します。Oracleソケット・アダプタのJCAバインディング・コンポーネントでは、基礎となるJCA相互作用がOracle BPEL PM統合のサービス(JCAバインディングを使用したWSDL)として公開されています。図5-1に、Oracleソケット・アダプタのアーキテクチャを示します。Oracle JCAアダプタのアーキテクチャの詳細は、「アーキテクチャ」を参照してください。

図5-1 Oracleソケット・アダプタのアーキテクチャ

図5-1の説明が続きます
「図5-1 Oracleソケット・アダプタのアーキテクチャ」の説明

5.1.1.1 ソケット・アダプタのメッセージ拒否および再発行は使用されない

ソケット・アダプタは、他のJCAアダプタに適用可能なメッセージ拒否および再試行機能をサポートしていません。

ダウンストリーム・アダプタから例外が発生した場合は通常、サーバー・ソケットに接続するクライアント・ソケット・アプリケーションがエラー処理を実行します。ソケット・アダプタでのメッセージ拒否はサポートされていないため、ソケット・アダプタではthExaltessage再発行機能は使用されません。

5.1.2 Oracleソケット・アダプタとメディエータの統合

Oracleソケット・アダプタは、自動的にメディエータと統合されます。JDeveloperデザイナでOracle Sockeアダプタ・サービスを作成すると、アダプタ構成ウィザードが起動します。このウィザードでOracleソケット・アダプタを構成できます。構成が完了すると、Oracle JDeveloper (JDeveloper)の「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。

アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。

Oracle JCAアダプタとメディエータの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。

5.1.3 Oracleソケット・アダプタOracle BPEL PMの統合

Oracleソケット・アダプタは、自動的にOracle BPEL PMと統合されます。JDeveloper BPELデザイナの「コンポーネント」ウィンドウから「ソケット・アダプタ」をドラッグ・アンド・ドロップすると、図5-2に示すように、アダプタ構成ウィザードが起動して「ようこそ」ページが表示されます。

図5-2 「アダプタ構成ウィザード - ようこそ」ページ

図5-2の説明が続きます
「図5-2 「アダプタ構成ウィザード - ようこそ」ページ」の説明

このウィザードでOracleソケット・アダプタを構成できます。アダプタ構成ウィザードでは、図5-3に示すように、サービス名の入力を求められます。

図5-3 「アダプタ構成ウィザード - サービス名」ページ

図5-3の説明が続きます
「図5-3 「アダプタ構成ウィザード - サービス名」ページ」の説明

構成が完了すると、JDeveloperの「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。

アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。

Oracle JCAアダプタとOracle BPEL PMの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。

5.1.4 Oracleソケット・アダプタとSOAコンポジットの統合

コンポジットは、設計されて単一アプリケーションにデプロイされるサービス、サービス・コンポーネント(Oracle BPEL PMおよびメディエータ)、ワイヤおよび参照のアセンブリです。コンポジットにより、メッセージに記述された情報が処理されます。コンポジットの詳細は、composite.xmlファイルに格納されます。Oracleソケット・アダプタとSOAコンポジットの統合の詳細は、「Oracle SOAコンポジットとアダプタの統合」を参照してください。

5.2 Oracleソケット・アダプタの機能

Oracleソケット・アダプタを使用すると、TCP/IPソケットを介してデータの読取りおよび書込みをするようにBPELプロセスまたはメディエータ・サービスを構成できます。

Oracleソケット・アダプタには次の特徴があります。

  • TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化が可能

  • インバウンドとアウトバウンドの両方の通信をサポート

  • 複雑なプロトコル・ハンドシェイクをXSLで宣言的にモデル化可能

  • プロトコル・ハンドシェイクのモデル化にカスタムJavaコードのプラグインを選択可能

  • アダプタがトランスレータ・インフラストラクチャ(NXSD)と統合されているため、ソケットを介したネイティブ・データの読取りおよび書込みをサポート

  • 複数のキャラクタ・エンコーディングをサポート

5.3 Oracleソケット・アダプタの概念

Oracleソケット・アダプタの考え方を概観します。

5.3.1 通信モード

Oracleソケット・アダプタでは、ソケットを介したインバウンドおよびアウトバウンドの通信(単方向または双方向)をサポートしています。Oracleソケット・アダプタの通信モードは、次の各項で説明します。

5.3.1.1 インバウンド同期リクエスト/レスポンス

インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。Oracleソケット・アダプタでは次に、同じ接続を使用してレスポンスを同期的に返信します。

図5-4に、インバウンド同期リクエスト/レスポンスのシナリオを示します。

図5-4 インバウンド同期リクエスト/レスポンスのBPELシナリオ

図5-4の説明が続きます
「図5-4 インバウンド同期リクエスト/レスポンスのBPELシナリオ」の説明

5.3.1.2 アウトバウンド同期リクエスト/レスポンス

アウトバウンド同期リクエスト/レスポンスの場合、リクエストはBPELまたはメディエータから行われます。Oracleソケット・アダプタはサーバー・ソケットに接続し、リクエスト・メッセージをサーバー・ソケットに出力ストリームで送信します。Oracleソケット・アダプタは次に、サーバー・ソケットからのレスポンスを入力ストリームでブロックし、レスポンスをBPELまたはメディエータに返信します。

図5-5に、アウトバウンド同期リクエスト/レスポンスのシナリオを示します。

図5-5 アウトバウンド同期リクエスト/レスポンスのBPELシナリオ

図5-5の説明が続きます
「図5-5 アウトバウンド同期リクエスト/レスポンスのBPELシナリオ」の説明

5.3.1.3 インバウンド受信

インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。このシナリオでは、リプライは送信されません。

5.3.1.4 アウトバウンド起動

アウトバウンドの一方向の起動シナリオの場合、リクエストはBPELまたはメディエータから行われます。Oracleソケット・アダプタはサーバー・ソケットに接続し、リプライを期待せずに、リクエスト・メッセージをサーバー・ソケットに出力ストリームで送信します。

5.3.2 プロトコル定義メカニズム

通信プロトコルまたはハンドシェイクは、認証手順、確認、状況に応じたデータの送受信など、異なる個別のステップで構成されます。Oracleソケット・アダプタでは、プロトコル・ハンドシェイクを定義する次の各メカニズムをサポートしています。

5.3.2.1 スタイルシートを使用したハンドシェイク・メカニズムを持つプロトコル

Oracleソケット・アダプタは、アダプタによって公開されるXPath拡張関数を使用するスタイルシートで定義される、ハンドシェイク・メカニズムで設計されたプロトコルを使用するように構成できます。ソケットのI/Oストリーム上、またはストリームの最後までの細かい読取りおよび書込み操作が可能です。これらの関数によって、データの読取りおよび書込みにネイティブ・フォーマットの構成メンバーを使用することも可能になります。このハンドシェイク・メカニズムでは、XSLT構成メンバーを使用して割当て、検証、制御フローなどの操作を定義します。

XPath拡張関数はトランスレータ・インフラストラクチャで次のように使用できます。

  • NXSDフレームワークで公開されるStyleReaderを使用して、次のメソッドでソケット・ストリームからの読取りおよび書込みを行います。

    • socketRead(nxsdStyle:String, nxsdStyleAttributes:String):String

      このメソッドを、ソケットの入力ストリームからの読取りに使用できます。

    • socketWrite(value:String, nxsdStyle:String, nxsdStyleAttributes:String):String

      このメソッドを、ソケットの出力ストリームへの書込みに使用できます。

    図5-6に示すXSLTは、StyleReaderを使用する拡張関数の使用方法を示しています。

    図5-6 StyleReaderを使用する拡張関数を利用したXSLT

    図5-6の説明が続きます
    「図5-6 StyleReaderを使用する拡張関数を利用したXSLT」の説明
  • 入力および出力変数を定義するスキーマに注釈を付け、NXSD構成メンバーを使用して、次のメソッドでソケット・ストリームからの読取りおよび書込みを行います。

    • socketReadWithXlation():DocumentFragment

      このメソッドを、入力用に構成されたスキーマおよびスキーマ要素を使用した、ソケットの入力ストリームからの読取りに使用できます。

    • socketWriteWithXlation(xml:NodeList)

      このメソッドを、出力用に構成されたスキーマを使用した、ソケットの出力ストリームへの書込みに使用できます。

    図5-7に示すXSDファイルは、NXSD構成メンバーを使用して、入力および出力変数を定義するスキーマに注釈を付け、拡張関数の使用方法を示しています。

    図5-7 StyleReaderを使用しない拡張関数を利用したXSD

    図5-7の説明が続きます
    「図5-7 StyleReaderを使用しない拡張関数を利用したXSD」の説明

スタイルシートを使用してハンドシェイクを定義するには、図5-8に示すように、「プロトコル」ページで「XSLTを使用してハンドシェイクを定義します」を選択し、参照してXSLファイルを選択する必要があります。

図5-8 スタイルシートを使用したハンドシェイク・メカニズムを持つプロトコルの定義

図5-8の説明が続きます
「図5-8 スタイルシートを使用したハンドシェイク・メカニズムを持つプロトコルの定義」の説明

5.3.2.2 カスタムJavaコードを使用したハンドシェイク・メカニズムを持つプロトコル

Oracleソケット・アダプタは、カスタムJavaコードのプラグインによって定義される、カスタマイズされたハンドシェイク・メカニズムを持つプロトコルを使用するように構成できます。このカスタムJavaコードは、ICustomParserインタフェースoracle.tip.pc.services.translation.util.ICustomParserを実装する必要があります。このインタフェースはOracleソケット・アダプタで提供され、ハンドシェイクのカスタム実装を可能にします。

注意:

ICustomParserインタフェース・ファイルは、bpm-infra.jarファイル内にあります。このjarファイルは、次のディレクトリにあります。

$SOA_ORACLE_HOME/soa/modules/oracle.soa.fabric_11.1.1

該当する通信パラダイムに基づき、次のメソッドを実装する必要があります。

  • public Element executeOutbound(InputStream in, OutputStream out, Element payLoad) throws Exception;

    アウトバウンド・ハンドシェイクはこのメソッドを実装する必要があります。

    例:

    public Element executeOutbound(InputStream in, OutputStream out, Element payLoad) throws Exception {
        BufferedReader in1 = new BufferedReader(new InputStreamReader(in));
        PrintWriter out1 = new PrintWriter(new OutputStreamWriter(out));
     
        out1.println(payLoad.getFirstChild().getNodeValue());
          
        String retVal = in1.readLine();
      
        StringBuffer strBuf = new StringBuffer();
        strBuf.append("<?xml version='1.0' encoding='" + enc + "' ?>"
                + "<out xmlns='http://xmlns.oracle.com/EchoServer/'>");
            strBuf.append(retVal + "</out>");
     
        DOMParser parser = new DOMParser();
        parser.setValidationMode(DOMParser.NONVALIDATING);
            Element elem = (Element) parser.getDocument().getElementsByTagName(
                "out").item(0);
     
        return elem;
    }
    
  • public Element executeInboundRequest(InputStream in) throws Exception;

    インバウンド・リクエストはこのメソッドを実装する必要があります。

    例:

    public Element executeInboundRequest(InputStream in) throws Exception {
        BufferedReader in1 = new BufferedReader(new InputStreamReader(in));
     
        String input = in1.readLine();
      
        StringBuffer strBuf = new StringBuffer();
        strBuf.append("<?xml version='1.0' encoding='" + enc + "' ?>"
                + "<EchoClientProcessRequest xmlns='http://xmlns.oracle.com/EchoClient'>");
     
            strBuf.append("<input>" + input + "</input></EchoClientProcessRequest>");
     
        DOMParser parser = new DOMParser();
        parser.setValidationMode(DOMParser.NONVALIDATING);
        parser.parse(new InputSource(new StringReader(strBuf.toString())));
        Element elem = (Element) parser.getDocument().getElementsByTagName(
                "EchoClientProcessRequest").item(0);
     
        return elem;
    }
    
  • public void executeInboundReply(Element payLoad, OutputStream out) throws Exception;

    インバウンド・リプライはこのメソッドを実装する必要があります。

    例:

    public void executeInboundReply(Element payLoad, OutputStream out) throws Exception {
        PrintWriter out1 = new PrintWriter(new OutputStreamWriter(out));
       
        NodeList list = payLoad.getChildNodes();
        String retVal = null;
        for(int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            NodeList list1 = node.getChildNodes();
            for(int j = 0; j < list1.getLength(); j++) {
                Node node1 = list1.item(j);
                if(node1.getNodeType() == Node.TEXT_NODE) {
                        retVal = node1.getNodeValue();
                }
            }
        }
        out1.println(retVal);
        out1.flush();
    }
    

注意:

inはソケットの入力ストリームへのハンドルで、outはソケットの出力ストリームへのハンドルです。

カスタムJavaコードを使用してハンドシェイクを定義するには、図5-9に示すように、「カスタムJavaコードを使用してハンドシェイクを定義します」を選択し、「Javaクラス」フィールドでハンドシェイクを実装するJavaクラスを指定する必要があります。

図5-9 カスタムJavaコードを使用したハンドシェイク・メカニズムを持つプロトコルの定義

図5-9の説明が続きます
「図5-9 カスタムJavaコードを使用したハンドシェイク・メカニズムを持つプロトコルの定義」の説明

5.3.2.3 ハンドシェイク・メカニズムを持たないプロトコル

Oracleソケット・アダプタは、ソケットのI/Oストリームとの間の変換に関連するハンドシェイクを必要としないプロトコルを使用するように構成できます。

ハンドシェイクを必要としないプロトコルを使用するには、図5-10に示すように、「プロトコル」ページで「ハンドシェイクなし」を選択する必要があります。

図5-10 ハンドシェイク・メカニズムを持たないプロトコルの定義

図5-10の説明が続きます
「図5-10 ハンドシェイク・メカニズムを持たないプロトコルの定義」の説明

5.3.3 キャラクタ・エンコーディングとバイト順

「エンコーディング」プロパティはネイティブ・データの格納に使用されるキャラクタ・エンコーディングを表し、「バイト順」プロパティはネイティブ・データのバイト順(BIG_ENDIANまたはLITTLE_ENDIAN)です。

キャラクタ・エンコーディングとバイト順は、ネイティブ・フォーマット・ビルダー・ウィザードを使用してスキーマ・ファイル(NXSD)内で指定できます。また、使用するエンコーディングとバイト順をアダプタ構成ウィザードで指定することもできます。エンコーディングとバイト順を指定しない場合、デフォルト値はUS-ASCIIBIG_ENDIANです。

変換を使用する場合にのみ適用可能なエンコーディングとバイト順の値を指定するには、アダプタ構成ウィザードの「プロトコル」ページで次の手順を実行する必要があります。

  1. 図5-11に示すように、「プロトコル」ページの「エンコーディング/バイト順」セクションで「エンコーディング/バイト順の指定」オプションを選択します。

    図5-11 「アダプタ構成ウィザード - プロトコル」ページ

    図5-11の説明が続きます
    「図5-11 「アダプタ構成ウィザード - プロトコル」ページ」の説明
  2. 次のいずれかのタスクを実行してエンコーディングを設定します。

    1. スキーマ・ファイルで指定されたエンコーディングを使用するには、「エンコーディング」の選択を解除したままにします。

    2. アダプタ構成ウィザードを使用してエンコーディングを指定するには、「エンコーディング」を選択し、「エンコーディング」リストからエンコーディング・タイプを選択します。

      注意:

      「エンコーディング」を選択した場合、アダプタ構成ウィザードを使用して指定したエンコーディング・タイプがNXSDファイル内で指定されているエンコーディング・タイプよりも優先されます。

  3. 次のいずれかのタスクを実行してバイト順を設定します。

    1. スキーマ・ファイルで指定したバイト順を使用するには、「スキーマからバイト順の値を使用します」を選択します。

    2. アダプタ構成ウィザードを使用してバイト順を指定するには、「バイト順」を選択し、「バイト順」リストからバイト順を選択します。

  4. 「終了」をクリックします。「終了」をクリックした後で、構成ウィザードに、ソケット・アダプタの構成が完了したことを示すページが表示されます。

5.3.4 パフォーマンス・チューニング

Oracleソケット・アダプタでは、次のパフォーマンス・チューニング機能がサポートされています。

詳細は、「Oracle JCAアダプタ・チューニング・ガイド」および「Oracle JCAアダプタのプロパティ」を参照してください。

5.3.4.1 Oracleソケット・アダプタの接続プーリングの構成

Oracleソケット・アダプタのパフォーマンスを最適化する方法の1つとして、接続プールの使用があります。接続先のソケット・サーバーが相互作用のたびにソケットを閉じないかぎり、接続プールを使用できます。接続プールを使用すると、ソケット接続を繰り返し使用でき、相互作用のたびに新規のソケットを作成するオーバーヘッドを回避できます。Oracleソケット・アダプタの接続プールは、Oracle WebLogic Serverコンソールを使用して構成する必要があります。

注意:

接続プール機能は、アウトバウンドの対話にのみ適用できます。

5.3.4.1.1 Oracleソケット・アダプタの接続プーリングの構成方法
  1. Oracle WebLogic Serverコンソールにログインします。このコンソールにアクセスするには、http://servername:portnumber/consoleにアクセスします。
  2. 「ドメイン構造」の左ペインで「デプロイメント」をクリックします。「デプロイメントのサマリー」ページが表示されます。

    図5-12 Oracle WebLogic Serverコンソール - 「デプロイメントの概要」ページ

    図5-12の説明が続きます
    「図5-12 Oracle WebLogic Serverコンソール - 「デプロイメントの概要」ページ」の説明
  3. SocketAdapterをクリックします。「SocketAdapterの設定」ページが表示されます。
  4. 「構成」タブをクリックします。
  5. アウトバウンド接続プール」タブをクリックし、javax.resource.cci.ConnectionFactoryを開いて図5-13に示すように構成済のコネクション・ファクトリを表示します。

    図5-13 Oracle WebLogic Serverコンソール - 「SocketAdapterの設定」ページ

    図5-13の説明が続きます
    「図5-13 Oracle WebLogic Serverコンソール - 「SocketAdapterの設定」ページ」の説明
  6. 「eis/socket/SocketAdapter」をクリックします。javax.resource.cci.ConnectionFactoryの設定ページが表示されます。
  7. 図5-14に示すように、KeepAliveコネクション・ファクトリのプロパティをtrueに設定します。Oracleソケット・アダプタの接続プール機能が有効になります。

    図5-14 Oracle WebLogic Serverコンソール - 「javax.resource.cci.ConnectionFactoryの設定」ページ

    図5-14の説明が続きます
    「図5-14 Oracle WebLogic Serverコンソール - 「javax.resource.cci.Connectionfactoryの設定」ページ」の説明
  8. 「保存」をクリックします。図5-15に示すように、メッセージ「デプロイメント・プランが正常に更新されました。」を含む「javax.resource.cci.ConnectionFactoryの設定」ページが表示されます。

    図5-15 Oracle WebLogic Serverコンソール - 「javax.resource.cci.ConnectionFactoryの設定」ページ

    図5-15の説明が続きます
    「図5-15 Oracle WebLogic Serverコンソール - 「javax.resource.cci.Connectionfactoryの設定」ページ」の説明

注意:

接続プール・パラメータは、Oracle WebLogic Server管理コンソールの「接続プール」タブを使用して変更できます。

接続プールのプロパティの変更時に、次のプロパティのデフォルト値は変更しないでください。
Initial capacity=0 
Max capacity=200 
Test on Create=false 
Test on Create=trueに変更すると、エンドポイントEISへのリソース・アダプタ接続がテストされます。SocketAdapterはダミー・メッセージを送信してソケットを接続し、接続を確認します。この処理により、例外状態になります。

5.4 Oracleソケット・アダプタの構成

Oracleソケット・アダプタを構成するには、次のタスクを実行する必要があります。

5.4.1 weblogic-ra.xmlファイルの変更

Oracleソケット・アダプタを構成するには、表5-1にリストされているプロパティの値をweblogic-ra.xmlファイルに指定する必要があります。これらのプロパティはOracle WebLogic Server管理コンソールから更新できます。詳細は、「アダプタ・コネクション・ファクトリの追加」を参照してください。

表5-1 Oracleソケット・アダプタの構成プロパティ

プロパティ 説明

ホスト

アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、接続先となるシステム名。インバウンド相互作用の場合は、常にlocalhostです。

ポート

アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、アダプタの接続先となるポート番号です。インバウンド相互作用の場合は、着信接続をソケット・アダプタがリスニングするポート番号です。

タイムアウト

この値がゼロ以外のタイムアウト間隔に設定されている場合、このソケットに関連付けられているInputStreamに対するread()コールは、このプロパティで指定された時間のみブロックされます。タイムアウト間隔に達すると、ソケットはまだ有効であっても、java.net.SocketTimeoutExceptionが発生します。このオプションは、ブロック操作が有効になる前に有効にする必要があります。タイムアウト間隔は0より大きい値を指定する必要があります。タイムアウト間隔に0を指定すると、無限タイムアウトと解釈されます。値はミリ秒単位です。

KeepAlive

アウトバウンド相互作用の場合にのみ適用可能。接続プール機能を使用するには、trueに設定する必要があります。

BacklogQueue

インバウンド相互作用の場合に適用可能。この値は、着信接続指示(接続リクエスト)の最大キュー長さを示します。キューが一杯のときに接続指示が到着すると、接続は拒否されます。

注意:

Oracleリリース11gからリリース12gにアップグレードすると、ServerSocketを作成する際の動作が変更されます。このため、hostnamelocalhostとして構成されていると、リモート・クライアントはServerSocketに接続できなくなる可能性があります。回避策として、localhosthostnameに変更してください。

サンプルのweblogic-ra.xmlファイルを次に示します。

<wls:connection-instance>
                <wls:description>Socket Adapter</wls:description>
                <wls:jndi-name>eis/socket/SocketAdapter</wls:jndi-name>
                <wls:connection-properties>
                    <wls:pool-params>
                        <wls:initial-capacity>0</wls:initial-capacity>
                        <wls:max-capacity>200</wls:max-capacity>
                        <wls:capacity-increment>5</wls:capacity-increment>
                        <wls:shrinking-enabled>true</wls:shrinking-enabled>
                        
<wls:shrink-frequency-seconds>60</wls:shrink-frequency-seconds>
                        
<wls:connection-creation-retry-frequency-seconds>2</wls:connection-creation-retry
-frequency-seconds>
                        
<wls:connection-reserve-timeout-seconds>5</wls:connection-reserve-timeout-seconds>
                        
<wls:match-connections-supported>true</wls:match-connections-supported>
                        <wls:use-first-available>true</wls:use-first-available>
                    </wls:pool-params>
                    
<wls:transaction-support>NoTransaction</wls:transaction-support>
                    
<wls:reauthentication-support>true</wls:reauthentication-support>
                    <wls:properties>
                        <wls:property>
                            <wls:name>Host</wls:name>
                            <wls:value>localhost</wls:value>
                        </wls:property>
                        <wls:property>
                            <wls:name>Port</wls:name>
                            <wls:value>12110</wls:value>
                        </wls:property>
                        <wls:property>
                            <wls:name>Timeout</wls:name>
                            <wls:value>10000</wls:value>
                        </wls:property>
                        <wls:property>
                            <wls:name>BacklogQueue</wls:name>
                            <wls:value>0</wls:value>
                        </wls:property>
                        <wls:property>
                            <wls:name>KeepAlive</wls:name>
                            <wls:value>True</wls:value>
                        </wls:property>
                    </wls:properties>
                    <wls:res-auth>Application</wls:res-auth>
                </wls:connection-properties>
            </wls:connection-instance>
		

注意:

接続プーリングを設定するには、KeepAliveプロパティをtrueに設定する必要があります。

5.4.2 ハンドシェイクのモデル化

クライアントまたはサーバー・ソケットと接続をネゴシエートするには、ハンドシェイクが必要な場合があります。

5.4.2.1 アウトバウンド・ハンドシェイクのモデル化

アウトバウンドXSLTでは、起動されたメッセージに対応する入力を使用します。アウトバウンドXSLTでは、拡張関数を使用してソケットの出力ストリームに書き込みます。この出力は、単方向通信ではダミーであり、双方向通信ではレスポンスになります。

次の例は、同期リクエスト/レスポンス通信パラダイムのモデル化を示しています。

<xsl:stylesheet 
...
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" />
xmlns:request="http://www.TragetNameSpace.com/Request" >
 
  <xsl:template match="/">
 
    <!–- Write the entire content of "books" element using translator -->
    <xsl:variable name="username" select="socket:socketWriteWithXlation(.)" />
 
    <!–- Read the stream using translator -->
    <xsl:copy-of select="socket:socketReadWithXlation()" />
    
  </xsl:template>
</xsl:stylesheet>

5.4.2.2 インバウンド・ハンドシェイクのモデル化

インバウンドXSLTでは、ダミー入力を使用し、拡張関数を通じてソケットの入力ストリームを読み取り、パブリッシュするXMLレコードを作成します。

次の例は、クライアントが、カンマ(,)で終了するユーザーIDとセミコロン(;)で終了するパスワードを検証用に送信してから、メッセージ・ペイロードを送信するハンドシェイクを示しています。

<xsl:stylesheet 
...
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" />
  <xsl:template match="/">
    <!-- Read the user name -->
    <xsl:variable name="username" 
select="socket:socketRead('terminated','terminatedBy=,')" />   
    <!-- Read password if user name is correct -->
    <xsl:if test="normalize-space($username)='user'">
      <xsl:variable name="password" 
select="socket:socketRead('terminated','terminatedBy=;')" />
      <!-- If password is correct proceed to read the payload using translator 
-->
      <xsl:if test="normalize-space($password)='password'">
        <!--  Send an OK -->
        <xsl:variable name="ack1" select="socket:socketWrite('001','','')" />

        <output>
<!--  Wait for the payload -->
          <xsl:copy-of select="socket:socketReadWithXlation()" />
        </output>
 
      </xsl:if>
      <!--  Send an error -->
      <xsl:else><xsl:variable name="ack2" 
select="socket:socketWrite('000','','')" /></xsl:else>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

5.4.3 XSLマッパー・ツールを使用したXSLファイルの設計

Oracleソケット・アダプタの場合、XSLマッパー・ツールを使用してXSLファイルを設計できます。次の各項では、様々な通信シナリオに使用するXSLの設計手順について説明します。

5.4.3.1 インバウンド同期リクエスト/リプライに使用するXSLの設計

この項では、XSLマッパー・ツールを使用してインバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。

注意:

この使用例を実行するには、Adapters-101SocketAdapterHelloWorldサンプルに含まれているartifacts.zipファイルの次のファイルが必要です。

  • artifacts/schemas/HelloWorld.xsd

Oracle SOA Sample CodeサイトAdapters-101SocketAdapterHelloWorldサンプルにアクセスできます。

このファイルをHelloWorldCompositeプロジェクトのHelloWorldComposite\xsdフォルダにコピーします。

5.4.3.1.1 SOAコンポジットの設計

SOAコンポジットを設計するには、「SOAコンポジットの設計」で説明する手順を実行します。

注意:

「SOAコンポジットの設計」の手順は、Oracle BPEL PMを使用するコンポジットに適用可能です。または、メディエータでコンポジットを作成することもできます。

5.4.3.1.2 インバウンドOracleソケット・アダプタの作成

インバウンドOracleソケット・アダプタ・サービスを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から、「ソケット・アダプタ」を「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  2. 「次へ」をクリックします。「サービス名」ページが表示されます。

  3. 「サービス名」フィールドにサービス名としてHelloWorldを入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  4. 図5-16に示すように、「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

    図5-16 「アダプタ構成ウィザード - アダプタ・インタフェース」ページ

    図5-16の説明が続きます
    「図5-16 「アダプタ構成ウィザード - アダプタ・インタフェース」ページ」の説明
  5. 「操作タイプ」として「インバウンド同期リクエスト/リプライ」を選択し、「次へ」をクリックします。「ソケット接続」ページが表示されます。

  6. 図5-17に示すように、「ソケット接続JNDI名」フィールドにeis/socket/InboundSocketAdapterと入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

    図5-17 「アダプタ構成ウィザード - ソケット接続」ページ

    図5-17の説明が続きます
    「図5-17 「アダプタ構成ウィザード - ソケット接続」ページ」の説明
  7. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  8. 図5-18に示すように、「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。

    図5-18 「タイプ・チューザ」ダイアログ

    図5-18の説明が続きます
    「図5-18 「タイプ・チューザ」ダイアログ」の説明
  9. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。

  10. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  11. 「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。

  12. 「OK」をクリックします。図5-19に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。

    図5-19 「アダプタ構成ウィザード - メッセージ」ページ

    図5-19の説明が続きます
    「図5-19 「アダプタ構成ウィザード - メッセージ」ページ」の説明
  13. 「次へ」をクリックします。図5-20に示すように、「プロトコル」ページが表示されます。

    図5-20 「アダプタ構成ウィザード - プロトコル」ページ

    図5-20の説明が続きます
    「図5-20 「アダプタ構成ウィザード - プロトコル」ページ」の説明
  14. 「XSLTを使用してハンドシェイクを定義します」を選択します。

  15. 「XSLT」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。図5-21に示すように、「入力」ダイアログが表示されます。

    図5-21 「プロトコル」ページの「入力」ダイアログ

    図5-21の説明が続きます
    「図5-21 「プロトコル」ページの「入力」ダイアログ」の説明
  16. 図5-21に示すように、XSLファイル名としてデフォルト値のrequest.xslを使用し、「OK」をクリックします。

  17. 「ReplyXslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。

  18. XSLファイル名としてデフォルト値のreply.xslを使用し、「OK」をクリックします。

  19. 「終了」をクリックします。request.xslおよびreply.xslファイルが作成されます。

    図5-22に、「request.xsl」ページを示します。

    図5-22 JDeveloper - 「request.xsl」ページ

    図5-22の説明が続きます
    「図5-22 JDeveloper - 「request.xsl」ページ」の説明

    注意:

    request.xsl」ページの左側にある「ソース」ペインにはdummy.xsdファイルが表示され、これがXSLマッパー・ツールのソースとして使用されます。

    インバウンド・リクエスト・シナリオの場合、Oracleソケット・アダプタはソケットが受信するネイティブ・データを読み取ってXMLフォーマットに変換します。つまり、ソース側にXMLファイルはありません。XSLTマッパーは常にソースおよびターゲットXSDファイルを必要とするため、マッパー・ツールにはダミーのXSDファイルが表示されます。

    図5-23に、「reply.xsl」ページを示します。

    図5-23 JDeveloper - 「reply.xsl」ページ

    図5-23の説明が続きます
    「図5-23 JDeveloper - 「reply.xsl」ページ」の説明

    注意:

    reply.xsl」ページの右側にあるターゲット・ペインには、dummy.xsdファイルが表示されます。このdummy.xsdファイルは、XSLマッパー・ツールのターゲットとして使用されます。

  20. インバウンド同期リクエスト/リプライ操作のリクエスト部分を次の手順で定義します。

    1. 図5-24に示すように、「request.xsl」ページで、「コンポーネント・パレット」の「Advanced Functions」リストからsocketReadを中央ペインにドラッグ・アンド・ドロップします。

      図5-24 JDeveloper - 「request.xsl」ページ

      図5-24の説明が続きます
      「図5-24 JDeveloper - 「request.xsl」ページ」の説明
    2. socketRead拡張関数をダブルクリックします。「関数の編集 - socketRead」ダイアログが表示されます。

    3. 図5-25に示すように、「nxsdStyle」および「nxsdStyleAttributes」フィールドに関数パラメータを入力します。

      図5-25 「関数の編集 - socketRead」ダイアログ

      図5-25の説明が続きます
      「図5-25 「関数の編集 - socketRead」ダイアログ」の説明

      注意:

      socketRead関数は、NXSDフレームワークで公開されているStyleReaderを使用してソケットの入力ストリームから読み取ります。

    4. 「OK」をクリックします。「request.xsl」(XSLマッパー・ツール)ページが表示されます。

    5. 中央ペインにあるsockRead関数を、右ペインにあるターゲットinputノードにリンクします。図5-26に示すように、XSLマッピングを示すrequest.xsl (XSLマッパー・ツール)が表示されます。

      図5-26 JDeveloper - 「request.xsl」ページ

      図5-26の説明が続きます
      「図5-26 JDeveloper - 「request.xsl」ページ」の説明
  21. インバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。

    1. 「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。

    2. 「reply.xsl」ページで、「コンポーネント」ウィンドウの「拡張関数」リストからsocketWriteを中央ペインにドラッグ・アンド・ドロップします。

    3. socketWrite拡張関数をダブルクリックします。「関数の編集 - socketWrite」ダイアログが表示されます。

    4. 図5-27に示すように、「valueToWrite」「nxsdStyle」および「nxsdStyleAttributes」フィールドに関数パラメータを入力します。

      図5-27 「関数の編集 - socketWrite」ダイアログ

      図5-27の説明が続きます
      「図5-27 「関数の編集 - socketWrite」ダイアログ」の説明

      注意:

      socketWrite関数は、NXSDフレームワークで公開されているStyleReaderを使用してソケットの出力ストリームに書き込みます。

    5. 「OK」をクリックします。「reply.xsl」(XSLマッパー・ツール)ページが表示されます。

    6. 中央ペインにあるsockWrite関数を、右ペインにあるターゲットinputノードにリンクします。図5-28に示すように、XSLマッピングを示すreply.xsl (XSLマッパー・ツール)が表示されます。

      図5-28 JDeveloper - 「reply.xsl」ページ

      図5-28の説明が続きます
      「図5-28 JDeveloper - 「reply.xsl」ページ」の説明
  22. 「ファイル」「すべて保存」を順番にクリックします。インバウンドOracleソケット・アダプタのrequest.xslおよびreply.xslファイルが作成されます。

5.4.3.2 アウトバウンド同期リクエスト/リプライに使用するXSLの設計

この項では、XSLマッパー・ツールを使用してアウトバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。

注意:

この使用例を実行するには、Adapters-101SocketAdapterHelloWorldサンプルに含まれているartifacts.zipファイルの次のファイルが必要です。

  • artifacts/schemas/HellowWorld.xsd

Oracle SOA Sample CodeサイトAdapters-101SocketAdapterHelloWorldサンプルにアクセスできます。

HelloWorld.xsdファイルをHelloWorldCompositeプロジェクトのHelloWorldComposite\xsdにコピーします。

5.4.3.2.1 SOAコンポジットの設計

SOAコンポジットを設計するには、「SOAコンポジットの設計」で説明する手順を実行します。

注意:

「SOAコンポジットの設計」の手順は、Oracle BPEL PMを使用するコンポジットに適用可能です。または、メディエータでコンポジットを作成することもできます。

5.4.3.2.2 アウトバウンドOracleソケット・アダプタの作成

アウトバウンドOracleソケット・アダプタ参照を作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  2. 「次へ」をクリックします。「サービス名」ページが表示されます。

  3. 「サービス名」フィールドにサービス名としてHelloWorldを入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  4. 図5-16に示すように、「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

  5. 「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択し、「次へ」をクリックします。「ソケット接続」ページが表示されます。

  6. 「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapterと入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

  7. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  8. 図5-18に示すように、「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。

  9. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。

  10. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  11. 「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。

  12. 「OK」をクリックします。図5-19に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。

  13. 「次へ」をクリックします。「プロトコル」ページが表示されます。

  14. 「XSLTを使用してハンドシェイクを定義します」を選択します。

  15. 「Xslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。

  16. XSLファイル名としてデフォルト値のinvoke.xslを使用し、「OK」をクリックします。

  17. 「終了」をクリックします。図5-29に示すように、XSLマッパー・ツールにinvoke.xslファイルが表示されます。

    図5-29 JDeveloper - 「invoke.xsl」ページ

    図5-29の説明が続きます
    「図5-29 JDeveloper - 「invoke.xsl」ページ」の説明
  18. ターゲット側で「HelloWorldProcessResponse」要素を右クリックします。図5-30に示すように、メニューが表示されます。

    図5-30 JDeveloper - 「invoke.xsl」ページ

    図5-30の説明が続きます
    「図5-30 JDeveloper - 「invoke.xsl」ページ」の説明
  19. 「変数の追加」をクリックします。図5-31に示すように、「変数の追加」ダイアログが表示されます。

    図5-31 「変数の追加」ダイアログ

    図5-31の説明が続きます
    「図5-31 「変数の追加」ダイアログ」の説明
  20. 「ローカル名」フィールドにvar1と入力して「OK」をクリックします。var1変数がXSLマッパー・ツールのターゲット・ペインに追加されます。

  21. 「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。

  22. アウトバウンド同期リクエスト/リプライ操作のリクエスト部分を、データをソケット・サーバーに書き込むように次の手順で定義します。

    1. 図5-32に示すように、「コンポーネント」ウィンドウの「拡張関数」リストからsocketWriteWithXlationを中央ペインにドラッグ・アンド・ドロップします。

      図5-32 JDeveloper - 「invoke.xsl」ページ

      図5-32の説明が続きます
      「図5-32 JDeveloper - 「invoke.xsl」ページ」の説明
    2. var1ノードをsocketWriteWithXlation関数にドラッグします。図5-33に示すように、リンクが作成されます。

      図5-33 JDeveloper - 「invoke.xsl」ページ

      図5-33の説明が続きます
      「図5-33 JDeveloper - 「invoke.xsl」ページ」の説明
    3. socketWriteWithXlation拡張関数をダブルクリックします。「関数の編集 - socketWriteWithXlation」ダイアログが表示されます。

    4. 図5-34に示すように、「NodeList」フィールドにドット1個(.)を入力します。

      図5-34 「関数の編集 - socketWriteWithXlation」ダイアログ

      図5-34の説明が続きます
      「図5-34 「関数の編集 - socketWriteWithXlation」ダイアログ」の説明

      注意:

      socketWriteWithXlation関数は、出力用に構成されたスキーマを使用してソケットの出力ストリームに書き込みます。

      「NodeList」フィールドで指定したドット(.)は、HelloWorldProcessRequestを最上位ノードに書き込むことを示します。

    5. 「OK」をクリックします。「警告」ダイアログが表示されます。

    6. 「はい」をクリックします。「invoke.xsl」ページが表示されます。同期リクエスト/リプライ操作のリクエスト部分が定義されています。

  23. アウトバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。

    1. 図5-35に示すように、「コンポーネント」ウィンドウの「拡張関数」リストからsocketReadWithXlationを中央ペインにドラッグ・アンド・ドロップします。

      図5-35 JDeveloper - 「invoke.xsl」ページ

      図5-35の説明が続きます
      「図5-35 JDeveloper - 「invoke.xsl」ページ」の説明
    2. 「コンポーネント」ウィンドウのリストから「一般」を選択し、「XSLTコンストラクト」を選択します。XSLT構成メンバーのリストが表示されます。

    3. copy-ofを、「コンポーネント」ウィンドウからターゲット・ペインのHelloWorldProcessResponseにドラッグします。図5-36に示すように、「copy-ofタイプ・ダイアログ」が表示されます。

      図5-36 JDeveloper - 「copy-ofタイプ・ダイアログ」が表示されている「invoke.xsl」ページ

      図5-36の説明が続きます
      「図5-36 JDeveloper - 「copy-ofタイプ・ダイアログ」が表示されている「invoke.xsl」ページ」の説明
    4. 「OK」をクリックします。図5-37に示すように、copy-of XSLT構成メンバーがターゲット・ペインに追加された状態で「invoke.xsl」(XSLマッパー・ツール)ページが表示されます。

      図5-37 JDeveloper - 「invoke.xsl」ページ

      図5-37の説明が続きます
      「図5-37 JDeveloper - 「invoke.xsl」ページ」の説明
    5. copy-of XSLT構成メンバーをsocketReadWithXlation関数にドラッグします。図5-38に示すように、リンクが作成されます。

      図5-38 JDeveloper - 「invoke.xsl」ページ

      図5-38の説明が続きます
      「図5-38 JDeveloper - 「invoke.xsl」ページ」の説明
  24. 「ファイル」「すべて保存」を順番にクリックします。アウトバウンド同期リクエスト/リプライのハンドシェイクが定義されます。

5.4.4 Oracleソケット・アダプタの構成プランでのTCPポートの指定

Oracleソケット・アダプタの構成プランでTCPポートを指定するには、次の手順を実行します(<service-name>はサービス名です)。

  1. <service-name>_tcp.jcaファイルにポート・プロパティを追加します。
    <property name="Port" value="Port"/>
  2. 構成プランXMLファイルに次のコードを追加します。
    <service_name=<XXXXXX">
     <property>
      <property name="Port">
       <replace>2222</replace>
     </property>
     <binding type'"jca"/>
    </service>
    
  3. .xmlファイルのサービス要素の下にポート・プロパティを追加し、デフォルト値(この例では1111)を指定します
    <service name="XXXXX" ui:wsdlLocation
      <interface.wsdl.interface="..."/>
      <binding.jca config="XXXX_tcp.jca"/>
        <property name="Port" type=xs:string" many="false"  
    override="may">1111</property>
    </service>

  4. 構成プランでコンポジットをデプロイします。

デプロイすると、Oracleソケット・アダプタは構成プランで指定されたポート2222でリスニングします。

構成プランなしでコンポジットをデプロイする場合、または構成プランがPortプロパティをオーバーライドしない場合、Oracle Socketアダプタはcomposite.xmlファイルのデフォルトのPortプロパティで指定されたソケット(この例ではポート1111)でリスニングします。

5.4.5 JavaScriptのサポート

ソケット・アダプタは現在、インバウンドとアウトバウンドの両方のトランザクションに対して複雑なハンドシェイクを定義する方法として、XSLTおよびカスタムJavaプラグインを使用しています。

ただし現在は、これらのトランザクションに対してハンドシェイクを定義する別の方法として、JavaScriptサポートを使用できます。この機能により、インバウンドとアウトバウンドの両方のトランザクションに対してシンプルでリクエスト-リプライのハンドシェイクを定義するためにコール可能な独自のJavaScriptを記述できます。

5.4.5.1 SOCKETアダプタ構成ウィザードによる、使用するスクリプトの定義

トランザクションのハンドシェイクを定義するには、JavaScriptを使用して次の準備を行います。

  1. 「プロトコル」画面で、「Javaスクリプトを使用してハンドシェイクを定義します」を選択します。

    図5-39 JavaScriptが選択されているSOCKETアダプタ構成ウィザード

    図5-39の説明が続きます
    「図5-39 JavaScriptが選択されているSOCKETアダプタ構成ウィザード」の説明
  2. 「終了」をクリックします。リフレッシュされた「プロトコル」画面で、スクリプトが定義されている場所を追加するか参照します。図5-40に、リクエストとリプライのスクリプトが表示されています。画面の残りの部分は変換に使用します。

    図5-40 ハンドシェイク定義のための追加選択が表示されたSOCKETアダプタ構成ウィザードの「プロトコル」画面

    図5-40の説明が続きます
    「図5-40 ハンドシェイク定義のための追加選択が表示されたSOCKETアダプタ構成ウィザードの「プロトコル」画面」の説明
  3. 「次へ」または「終了」をクリックします。ソケット通信の提供に役立つJavaScriptを使用したソケット・アダプタの構成が完了しました。

5.4.5.2 レポート

ソケット・アダプタXSLTおよびJavaScriptの使用例では、クライアント/サーバーのソケットと通信するための通信プロトコルを定義します。NXSDベースの使用例と比較した場合、通常はこの通信では多くのデータ転送は行われません。これらの使用例ではメッセージ・サイズを取得する意味があまりないため、ソケット・アダプタをデプロイし、Fusion Middleware Controlで提供されているスナップショット・レポート・オプションを有効化した場合、メッセージの統計は取得されません。

アダプタ・レポート統計は、NXSDとXSDの変換に対してのみ収集されることに注意してください。これらの統計は、XSLT、JavaScriptおよびカスタム・プロトコルに対してはサポートされていません。

5.4.5.3 サンプル・スクリプト

次のJavaScriptは、この機能で使用するサンプルのJavaScriptです。

importPackage(java.io);
importPackage(java.lang);
importPackage(javax.xml.parsers);
 
println("=====> Under Script Execution");
var inputStream = InputStreamKey;
var outputStream = OutputStreamKey;
var requestPayloadElement = RequestPayloadElementKey;
var ReplyDOMResult = ReplyDOMResultKey;
 
var isr = new InputStreamReader(inputStream);
var osw = new OutputStreamWriter(outputStream);
var br = new BufferedReader(isr);
 
println("=====> starting handshake");
 
var reply = doHandshake();
 
createDOM(reply);
 
function writeToServer(request) {
	println("=====> Under writeToServer");
	var bw = new BufferedWriter(osw);
	bw.write(request);
	bw.newLine();
	bw.flush();
}
 
function doHandshake() {
	println("=====> Under extractPayload ");
	var nodeList = requestPayloadElement.getChildNodes();
	var length = nodeList.getLength();
	println("=====> Length :" +  length);
        //var i = 0;
        var name = "";
        var empId = "";
        for(var i=0 ; i < length; i++){
            println("===> Name" + i + "=" + nodeList.item(i).getNodeName()); // +  "; Value=" + nodeList.item(i).getFirstChild().getNodeValue());
            if(nodeList.item(i).getNodeName().indexOf("Name")!= -1){
                name = nodeList.item(i).getFirstChild().getNodeValue();
            }
            else if(nodeList.item(i).getNodeName().indexOf("EmpId")!= -1){
                empId = nodeList.item(i).getFirstChild().getNodeValue();
            }
        }
	/*println("=====> name: "+ nodeList.item(0).getNodeName());
	name = nodeList.item(0).getFirstChild().getNodeValue();
	
	
	println("=====> name: "+nodeList.item(1).getNodeName());
	empId = nodeList.item(1).getFirstChild().getNodeValue();*/
	
	println("=====> name :"+name);
	println("=====> empId :"+empId);
	
        var xmlPayload = "Hello World";/*"<ns1:Inbound-Element xmlns:ns1=\"http://xmlns.oracle.com/pcbpel/demoSchema/csv\"><ns1:Name>" + name + "</ns1:Name>" +
            			"<ns1:EmpId>" + empId +"</ns1:EmpId></ns1:Inbound-Element>";*/
        println("=====> xmlPayload :"+xmlPayload);
	writeToServer(name);
	writeToServer(empId);
	osw.close();
	var code = readFromServer();
	return code;
}
 
function readFromServer() {
    println("=====> Under readFromServer ");
    var str = ""; //= br.readLine();
    var tmpStr = "";
    while (true){
    tmpStr = br.readLine();
    if(tmpStr == -1 ||  tmpStr == null)
        break;
        println("tmpStr=" + tmpStr);
        str += tmpStr;
    }
    
    println("=====> Reply from Server :"+str);
    return  str;
}
 
function createDOM(code){
	println("=====> Under createDOM "); ;
        var fRootNode = null;
        var fDocument = null;
        var fTempNode = null;
        var NAMESPACE = "http://xmlns.oracle.com/pcbpel/demoSchema/csv";
        var ROOT_NODE = "Result";
        var dbf = DocumentBuilderFactory.newInstance();
        var db = dbf.newDocumentBuilder();
        fDocument = db.newDocument();
 
        fRootNode = fDocument.createElementNS(NAMESPACE, ROOT_NODE);
        fRootNode.appendChild(fDocument.createTextNode(code));
        
        ReplyDOMResult.setNode(fRootNode);
}

5.4.6 ソケット・アダプタNIOのサポート

現在のソケット・アダプタでは、インバウンド接続に対して、接続ごとにスレッドのアプローチが使用されます。接続ごとにスレッドのアプローチでは、接続ごとに排他的なワーカー・スレッドを使用します。処理ループ内で、ワーカー・スレッドは新規の受信データを待機し、リクエストを処理して、レスポンス・データを返します。この動作により、相互作用が完了するまでスレッドがブロックされます。

ただし、多くの同時ユーザーがインバウンド・ソケット・アダプタを使用しているシナリオでは、オペレーティングシステム/スレッド・プールの制限に達すると、スレッドの待機が発生します。多くのスレッドに独自のメモリー・フットプリントがありますが、このため特定の場合にメモリー不足の例外が発生することがあります。

ソケット・アダプタは(新規I/O) NIO APIを使用します。NIOのAPIは、最近のオペレーティング・システムの低レベルI/O操作にアクセスできるように設計されています。

NIO APIにより、スレッド数がユーザーによる構成が可能な値にまで削減されます。これにより、システムがロードされているシナリオで、ソケット・アダプタはより優れたパフォーマンスおよびスループットを得ることができます。

ソケット・アダプタは、NXSD変換モードに対してのみNIO APIをサポートしていることに注意してください。これを他のモードでサポートしない理由は、NIOが、リクエストの後に常にリプライが続くシナリオである、固有のリクエスト-リプライ・モデルを前提としているためです。

他の変換モードでは、リクエストの後にリプライが続かないこともあります。たとえば、ソケット・サーバーが、クライアント接続を受信した後にようこそメッセージを送信するシナリオがあります。

または、複数のハンドシェイク(複数の読取りの後に書込みが続く)が存在するシナリオもあります。このようなシナリオでは、ソケット・アダプタは、最初の読取りの全データが到着したかどうかを認識しません。

アダプタは、処理中のNIOイベントに対するNIOプロセッサ・スレッド数の構成をサポートします。このプロパティのデフォルト値は1です。

プロパティNIOProcessorThreadCountにデフォルト値である1以外の値を指定する場合は、適切なJCAファイルにプロパティNIOProcessorThreadCountを手動で追加する必要があります。次の例では、NIOProcessorThreadCountの値は2に設定されます。

例 - jcaファイル内のプロパティNIOProcessorThreadCountの値の手動設定

<adapter-config name="inboundRequestReplyService" adapter="Socket Adapter" wsdlLocation="inboundRequestReplyService.wsdl"
				xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata">
  <connection-factory location="eis/socket/SocketAdapter" adapterRef=""/>
  <endpoint-activation portType="InboundRequestReply_ptt" operation="InboundRequestReply" 
     UITransmissionPrimitive="InboundRequestReply">
    <activation-spec className=
               "oracle.tip.adapter.socket.SocketActivationSpec">
      <property name="TransMode" value="NXSD"/>
      <property name="NIOProcessorThreadCount" value="2"/>
    </activation-spec>
  </endpoint-activation>
</adapter-config>

スレッド数が相互作用ごとに作成される古い実装を使用する場合は、JCAファイルで次を使用します。

例 - 相互作用ごとにスレッド数を指定するサンプルjcaファイル

<adapter-config name="inboundRequestReplyService"
      adapter="Socket Adapter"
                  wsdlLocation="inboundRequestReplyService.wsdl"
   				xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata">
     <connection-factory location="eis/socket/SocketAdapter" adapterRef=""/>
     <endpoint-activation portType="InboundRequestReply_ptt"
       operation="InboundRequestReply"
            UITransmissionPrimitive="InboundRequestReply">
      <activation-spec className=
                  "oracle.tip.adapter.socket.SocketActivationSpec">
         <property name="TransMode" value="NXSD"/>
         <property name="SupportNIO" value="false"/>
    </activation-spec>
  </endpoint-activation>
</adapter-config>

5.4.7 ソケット・アダプタに対するSSLのサポート

SSL (Secure Socket Layer)は、インターネット上での通信セキュリティを提供する暗号化プロトコルです。鍵交換の非対称型暗号化およびプライバシの対称型暗号化を提供し、トランスポート・レイヤーでネットワーク接続のセグメントを暗号化します。

Oracle Platform Security Service (OPSS)キーストア・サービスでは、SSL、メッセージ・セキュリティ、暗号化および関連タスク用のキーおよび証明書を管理できます。キーストア・サービスは、キー、証明書およびその他のアーティファクトを含むキーストアを作成および管理するために使用します。

KSSを使用するときにTrustStoreNameおよびTrustStoreStripeNameを指定しない場合は、ドメイン・レベル・トラスト・ストア(システム/トラスト)が使用されます。

5.4.7.1 ソケット・アダプタでのSSLのサポート

セキュア・ソケット接続を介してデータを送受信する場合は、ソケット・アダプタでSSLをサポートする必要があります。これにより、ベースとなるネットワーク・トランスポート・プロトコル上に次のようなセキュリティ保護層が追加されます。

  • 整合性の保護

  • 認証

  • 機密性(プライバシの保護)

SSLは非NIOのシナリオでのみサポートされます。

SSLは、NXSD変換モードを使用したリクエスト-リプライ・シナリオではサポートされていません。トランスレータ(NXSDまたは不透明ペイロード用)は、ネイティブ・フォーマットからXML SSLに変換する前に、ストリームの終了を探します。ソケット・アダプタAPIではストリームの終了がサポートされないため、NXSD変換を使用したソケット・アダプタはリクエスト-リプライの使用例ではサポートされません。

表5-2に、ソケット・アダプタSSLコネクション・ファクトリのプロパティを示します。これには、KSS (Oracle PSS)モードでSSLを構成するときのSSLコネクション・ファクトリのプロパティのリストも含まれます。

表5-2 KSSモードで構成するときのSSLコネクション・ファクトリのプロパティ

説明

SslEnable

コネクション・ファクトリがSSLであるかどうかを指定します。

KeyStorePassword

キーストアのパスワード。

TrustStorePassword

トラスト・ストアのパスワード。

SslProtocol

SSLプロトコルのバージョン(SSLv3)。

KeyStoreProviderName

キーストアのプロバイダ

KeyStoreType

キーストアのタイプ(=KSS)。

KeyStoreAlgorithm

キー・マネージャ・ファクトリのアルゴリズム。

TrustStoreProviderName

トラスト・ストアのプロバイダ

TrustStoreType

トラスト・ストアのタイプ(=KSS)。

TrustStoreAlgorithm

キー・マネージャ・ファクトリのアルゴリズム。

NeedClientAuthentication

クライアント認証が必須かどうかを指定します(インバウンド)。

KeyStoreStripeName

キーストアが作成されるストライプの名前。

KeyStoreStripeName

特定のストライプの下のキーストアの名前。

TrustStoreName

特定のストライプの下のトラスト・ストアの名前。

TrustStoreStripeName

トラスト・ストアが作成されるストライプの名前。

5.4.8 複数のリクエストを受け入れるためのOracle Socket Adapterの有効化

クライアント・ソケットがソケット接続でメッセージをサーバー・ソケットへ送信すると、ソケット接続は要求を処理した後に閉じられます。ただし、複数のリクエストを受け入れるには、長い時間クライアント・ソケット接続をオープンにしておくことができます。

Oracle Socket Adapterが複数のリクエストを処理できるようにするには、カスタム・トランスレータを記述します。

注意:

この機能は、パッチとして入手できます。このリリースのパッチをダウンロードして、インスタンスを更新します。
  1. ra.xmlのJCA接続プロパティPersistentClienttrueに設定します。このプロパティはデフォルトでfalseに設定されています。
    <config-property> 
    <config-property-name>PersistentClient</config-property-name> 
    <config-property-type>java.lang.String</config-property-type> 
      <config-property-value>false</config-property-value> 
    </config-property>
  2. composite.xmlのJCAバインディング・プロパティConcurrentInboundProcessorを選択した値に変更します。このプロパティは、BPELプロセスを呼び出すクライアント・ソケットの数を制限します。デフォルト値は50で、これは50の同時ソケット・クライアントによってBPELプロセスを呼び出せます。
    <property name="ConcurrentInboundProcessor" type="xs:anyAtomicType" 
    many="false" override="may">50</property>
  3. カスタム・トランスレータを記述します。次にカスタム・トランスレータの例を示します。
    import java.io.ByteArrayInputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.io.StringWriter; 
    import java.util.Base64; 
     
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory; 
    import javax.xml.parsers.ParserConfigurationException; 
    import javax.xml.transform.Transformer; 
    import javax.xml.transform.TransformerException; 
    import javax.xml.transform.TransformerFactory; 
    import javax.xml.transform.dom.DOMSource; 
    import javax.xml.transform.stream.StreamResult; 
     
    import oracle.tip.pc.services.translation.util.ICustomParser; 
     
    import org.w3c.dom.Document; 
    import org.w3c.dom.Element; 
    import org.w3c.dom.Node; 
    import org.xml.sax.SAXException; 
     
    public class CustomTranslator implements ICustomParser { 
     
        public void executeInboundReply(Element arg0, OutputStream arg1) throws 
    Exception { 
            String strPayload = printDoc(arg0); 
            System.out.println("Custom Translator: Response"); 
            arg1.write(strPayload.getBytes()); 
            arg1.flush(); 
        } 
     
    public Element executeInboundRequest(InputStream inStream) throws Exception { 
            int size = 10; 
            System.out.println("Custom Translator: Request"); 
            // define a buffer to hold the incoming data 
            byte[] buffer = new byte[size]; 
            // variable to read single bytes 
            int singleByte = -1; 
            // Keeps the index of buffer until 1KB(size) 
            int index = 0; 
            // Reads stream until you reach 1KB size or -1 
            while ((singleByte = inStream.read()) != -1) { 
                    buffer[index++] = (byte) singleByte; 
                    // Break the reading. This way, stream will be kept open for 
    next 
                    // read 
                    if (index >= size) 
                            break; 
            } 
            // Copy bytes which you read in buffer to finalBytes array 
            byte[] finalBytes = Arrays.copyOf(buffer, index); 
           
    /*          Check whether you reached end of stream while reading. If yes, 
    	then check data was enough to create new request. against size Then return 
              the null to adapter for closing the client socket Note: last read 
              which was not enough to create request will be lost. 
    */         
            if (singleByte == -1 && finalBytes.length < size) { 
                    System.out.println("End of stream reached!!"); 
                    return null; 
            } 
    
            String strXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" 
    standalone=\"yes\"?><base64text>" 
                            + new String(Base64.getEncoder().encode(finalBytes)) 
    + "</base64text>"; 
    
            return getDomElement(strXml); 
        } 
     
      //This is for outbound 
      public Element executeOutbound(InputStream arg0, OutputStream arg1, Element 
    arg2) throws Exception { 
        return null; 
      } 
     
      //Dom parser for give xml string and this returns XML element 
      private Element getDomElement(String strXml) throws 
    ParserConfigurationException, SAXException, IOException { 
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder db = dbf.newDocumentBuilder(); 
        Document doc = db.parse(new ByteArrayInputStream(strXml.getBytes())); 
        return doc.getDocumentElement(); 
      } 
     
      //Used in case of response to convert xml element to string payload 
      private String printDoc(Node node) throws TransformerException { 
        DOMSource domSource = new DOMSource(node); 
        StringWriter writer = new StringWriter(); 
        StreamResult result = new StreamResult(writer); 
        TransformerFactory tf = TransformerFactory.newInstance(); 
        Transformer transformer = tf.newTransformer(); 
        transformer.transform(domSource, result); 
        return writer.toString(); 
      } 
    } 

    注意:

    カスタム・トランスレータのpublic Element executeInboundRequest (InputStream inStream)例外メソッドは、入力ストリームからのすべてのメッセージを読み取った後、ソケット接続を終了するにはnullを返す必要があります。

5.5 Oracleソケット・アダプタの使用例

この項では、次に示すOracleソケット・アダプタの使用例を説明します。

5.5.1 Oracleソケット・アダプタHello World

これは単純なHelloWorldの使用例であり、Oracleソケット・アダプタを使用した通信の同期インバウンド・リクエスト/レスポンス・モードと同期アウトバウンド・リクエスト/レスポンス・モードを示しています。HelloWorldビジネス・プロセスはOracleソケット・アダプタのインバウンド・サービスから入力文字列を取得し、メッセージをBPELプロセスにパブリッシュします。

BPELプロセスはOracleソケット・アダプタのアウトバウンド・サービス(入力文字列に接頭辞?Hello?を追加して戻す単純なHelloWorldサーバー)を起動し、同期リプライを使用して受信した文字列を戻します。

この使用例には、次の項目が含まれます。

5.5.1.1 前提条件

この使用例を実行するには、Adapters-101SocketAdapterHelloWorldサンプルに含まれているartifacts.zipファイルの次のファイルが必要です。

  • artifacts/schemas/HelloWorld.xsd

  • artifacts/xsl/request.xsl

  • artifacts/xsl/reply.xsl

  • artifacts/xsl/invoke.xsl

Oracle SOA Sample CodeサイトでAdapters-101SocketAdapterHelloWorldサンプルにアクセスできます。

5.5.1.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成する手順は、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 図5-41に示すように、「アプリケーション名」フィールドにhelloworld-socketと入力して「次へ」をクリックします。「プロジェクトの名前付け」ページが表示されます。

    図5-41 「SOAアプリケーションの作成」ダイアログ

    図5-41の説明が続きます
    「図5-41 「SOAアプリケーションの作成」ダイアログ」の説明
  3. 「OK」をクリックします。「プロジェクトの名前付け」ダイアログが表示されます。
  4. 図5-42に示すように、「プロジェクト名」フィールドにHelloWorldCompositeと入力してから「プロジェクト・テクノロジ」の下で「SOA」を選択し、右矢印をクリックして「選択済」ボックスに移動します。

    HelloWorldアプリケーションとHelloWorldCompositeプロジェクトが「アプリケーション・ナビゲータ」に表示されます。

    図5-42 「プロジェクトの作成」ダイアログ

    図5-42の説明が続きます
    「図5-42 「プロジェクトの作成」ダイアログ」の説明
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 図5-43に示すように、「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成」ダイアログが表示されます。

    図5-43 「SOA設定の構成」ダイアログ

    図5-43の説明が続きます
    「図5-43 「SOA設定の構成」ダイアログ」の説明
  7. 図5-44に示すように、「名前」フィールドにHelloWorldFlowと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。

    図5-44 「BPELプロセスの作成」ダイアログ

    図5-44の説明が続きます
    「図5-44 「BPELプロセスの作成」ダイアログ」の説明
  8. 「OK」をクリックします。図5-45に示すように、HelloWorldアプリケーションとHelloWorldCompositeプロジェクトが設計領域に表示されます。

    図5-45 JDeveloper - composite.xml

    図5-45の説明が続きます
    「図5-45 JDeveloper - composite.xml」の説明
  9. HelloWorld.xsdファイルをプロジェクトのxsdディレクトリにコピーします(このファイルの場所は、「前提条件」を参照)。
  10. request.xslreply.xslおよびinvoke.xslファイルをプロジェクトのxslディレクトリにコピーします(これらのファイルの場所は、「前提条件」を参照)。

5.5.1.3 インバウンドOracleソケット・アダプタ・サービスの作成

次の手順に従ってインバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」から、「ソケット・アダプタ」を「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 図5-46に示すように、「サービス名」フィールドにHelloWorldClientと入力します。

    図5-46 「アダプタ構成ウィザード - サービス名」ページ

    図5-46の説明が続きます
    「図5-46 「アダプタ構成ウィザード - サービス名」ページ」の説明
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 図5-47に示すように、「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

    図5-47 「アダプタ構成ウィザード - アダプタ・インタフェース」ページ

    図5-47の説明が続きます
    「図5-47 「アダプタ構成ウィザード - アダプタ・インタフェース」ページ」の説明
  6. 図5-48に示すように、「操作タイプ」として「インバウンド同期リクエスト/リプライ」を選択します。

    図5-48 「アダプタ構成ウィザード - 操作」ページ

    図5-48の説明が続きます
    「図5-48 「アダプタ構成ウィザード - 操作」ページ」の説明
  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。
  8. 図5-49に示すように、「ソケット接続JNDI名」フィールドにeis/socket/InboundSocketAdapterと入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

    図5-49 「アダプタ構成ウィザード - ソケット接続」ページ

    図5-49の説明が続きます
    「図5-49 「アダプタ構成ウィザード - ソケット接続」ページ」の説明
  9. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 図5-50に示すように、「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。

    図5-50 「タイプ・チューザ」ダイアログ

    図5-50の説明が続きます
    「図5-50 「タイプ・チューザ」ダイアログ」の説明
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
  12. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  13. 「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
  14. 「OK」をクリックします。図5-51に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。

    図5-51 「アダプタ構成ウィザード - メッセージ」ページ

    図5-51の説明が続きます
    「図5-51 「アダプタ構成ウィザード - メッセージ」ページ」の説明
  15. 「次へ」をクリックします。「プロトコル」ページが表示されます。
  16. 「XSLTを使用してハンドシェイクを定義します」を選択します。
  17. 「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
  18. 図5-52に示すように、ファイル名として「request.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。

    図5-52 「SOAリソース・ブラウザ」ダイアログ

    図5-52の説明が続きます
    「図5-52 「SOAリソース・ブラウザ」ダイアログ」の説明
  19. 「ReplyXslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
  20. ファイル名として「reply.xsl」を選択して「OK」をクリックします。図5-53に示すように、「Xslt」フィールドに移入が行われます。

    図5-53 「アダプタ構成ウィザード - プロトコル」ページ

    図5-53の説明が続きます
    「図5-53 「アダプタ構成ウィザード - プロトコル」ページ」の説明
  21. 「終了」をクリックします。「composite.xml」ページが図5-54のように表示されます。

    図5-54 JDeveloper - 「composite.xml」ページ

    図5-54の説明が続きます
    「図5-54 JDeveloper - 「composite.xml」ページ」の説明

5.5.1.4 アウトバウンドOracleソケット・アダプタ・サービスの作成

次の手順に従ってアウトバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 「サービス名」フィールドにHelloWorldServerと入力します。
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
  6. 図5-55に示すように、「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。

    図5-55 「アダプタ構成ウィザード - 操作タイプ」ページ

    図5-55の説明が続きます
    「図5-55 「アダプタ構成ウィザード - 操作タイプ」ページ」の説明
  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。
  8. 図5-56に示すように、「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapterと入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

    図5-56 「アダプタ構成ウィザード - ソケット接続」ページ

    図5-56の説明が続きます
    「図5-56 「アダプタ構成ウィザード - ソケット接続」ページ」の説明
  9. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 図5-50に示すように、「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
  12. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  13. 「プロジェクトのスキーマ・ファイル」「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。
  14. 「OK」をクリックします。図5-51に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
  15. 「次へ」をクリックします。「プロトコル」ページが表示されます。
  16. 「XSLTを使用してハンドシェイクを定義します」を選択します。
  17. 「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
  18. 図5-57に示すように、「ファイル名」として「invoke.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。

    図5-57 「SOAリソース・ブラウザ」ダイアログ

    図5-57の説明が続きます
    「図5-57 「SOAリソース・ブラウザ」ダイアログ」の説明
  19. 「終了」をクリックします。「composite.xml」ページが図5-58のように表示されます。

    図5-58 JDeveloper - 「composite.xml」ページ

    図5-58の説明が続きます
    「図5-58 JDeveloper - 「composite.xml」ページ」の説明

5.5.1.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続する手順は、次のとおりです。

  1. 「公開されたサービス」領域にあるHelloWorldClientの小さい三角形を、「コンポーネント」領域のHelloWorldFlow BPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるHelloWorldFlow BPELプロセス内の小さい三角形を、「外部参照」領域のHelloWorldServerに緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDeveloperのcomposite.xmlが図5-59のように表示されます。

    図5-59 JDeveloper - composite.xml

    図5-59の説明が続きます
    「図5-59 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.1.5.1 receiveアクティビティの追加
  1. 「HelloWorldFlow」をダブルクリックします。「BPELHelloWorld.bpel」ページが表示されます。
  2. 図5-60に示すように、「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。

    図5-60 JDeveloper - HelloWorldFlow.bpel

    図5-60の説明が続きます
    「図5-60 JDeveloper - HelloWorldFlow.bpel」の説明
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 図5-61に示すように、「名前」フィールドにReceiveInputと入力します。

    図5-61 「Receive」ダイアログ

    図5-61の説明が続きます
    「図5-61 「Receive」ダイアログ」の説明
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 図5-62に示すように、「HelloWorldClient」を選択して「OK」をクリックします。

    図5-62 「パートナ・リンク・チューザ」ダイアログ

    図5-62の説明が続きます
    「図5-62 「パートナ・リンク・チューザ」ダイアログ」の説明
  7. 図5-63に示すように、「Receive」ダイアログで「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    図5-63 「Receive」ダイアログ

    図5-63の説明が続きます
    「図5-63 「Receive」ダイアログ」の説明
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。図5-64に示すように、JDeveloperの「HelloWorldFlow.bpel」ページが表示されます。

    図5-64 JDeveloper - HelloWorldFlow.bpel

    図5-64の説明が続きます
    「図5-64 JDeveloper - HelloWorldFlow.bpel」の説明
5.5.1.5.2 invokeアクティビティの追加
  1. 図5-65に示すように、「コンポーネント」ウィンドウから設計領域に、receiveInputアクティビティの後にinvokeアクティビティをドラッグ・アンド・ドロップします。

    図5-65 JDeveloper - HelloWorldFlow.bpel

    図5-65の説明が続きます
    「図5-65 JDeveloper - HelloWorldFlow.bpel」の説明
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 図5-66に示すように、「名前」フィールドにWriteHelloWorldと入力します。

    図5-66 JDeveloper - HelloWorldFlow.bpel

    図5-66の説明が続きます
    「図5-66 JDeveloper - HelloWorldFlow.bpel」の説明
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 図5-67に示すように、「HelloWorldServer」を選択して「OK」をクリックします。

    図5-67 「パートナ・リンク・チューザ」ダイアログ

    図5-67の説明が続きます
    「図5-67 「パートナ・リンク・チューザ」ダイアログ」の説明
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  8. 同じ手順を繰り返して出力変数を選択します。図5-68に示すように、Invokeダイアログが表示されます。

    図5-68 「Invoke」ダイアログ

    図5-68の説明が続きます
    「図5-68 「起動」ダイアログ」の説明
  9. 「OK」をクリックします。図5-69に示すように、JDeveloper「HelloWorldFlow.bpel」ページが表示されます。

    図5-69 JDeveloper - HelloWorldFlow.bpel

    図5-69の説明が続きます
    「図5-69 JDeveloper - HelloWorldFlow.bpel」の説明
5.5.1.5.3 replyアクティビティの追加
  1. 図5-70に示すように、「コンポーネント」ウィンドウから設計領域にreplyアクティビティをドラッグ・アンド・ドロップします。

    図5-70 JDeveloper - HelloWorldFlow.bpel

    図5-70の説明が続きます
    「図5-70 JDeveloper - HelloWorldFlow.bpel」の説明
  2. replyアクティビティをダブルクリックします。「Reply」ダイアログが表示されます。
  3. 「名前」フィールドにReplyと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 図5-62に示すように、「HelloWorldClient」を選択して「OK」をクリックします。
  6. 「Reply」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。図5-71に示すように、「変数」フィールドにデフォルトの変数名が移入されます。

    図5-71 「Reply」ダイアログ

    図5-71の説明が続きます
    「図5-71 「Reply」ダイアログ」の説明
  8. 「OK」をクリックします。図5-72に示すように、JDeveloper「HelloWorldFlow.bpel」ページが表示されます。

    図5-72 JDeveloper - HelloWorldFlow.bpel

    図5-72の説明が続きます
    「図5-72 JDeveloper - HelloWorldFlow.bpel」の説明
5.5.1.5.4 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「コピー操作」タブをクリックします。図5-73に示すように、Assignダイアログが表示されます。

    図5-73 「Assign」ダイアログ - 「コピー操作」タブ

    図5-73の説明が続きます
    「図5-73 「Assign」ダイアログ - 「コピー操作」タブ」の説明
  4. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  5. 左ペインで、「ReceiveInput_InboundRequestReply_InputVariable」変数の下にある「ns3:input」を選択します。
  6. 図5-74に示すように、右ペインで「WriteHelloWorld_OutboundRequestReply_InputVariable」変数の下にある「ns3:input」を選択します。

    図5-74 「コピー操作の作成」ダイアログ

    図5-74の説明が続きます
    「図5-74 「コピー操作の作成」ダイアログ」の説明
  7. 「OK」をクリックします。Assignダイアログが表示されます。
  8. 「OK」をクリックします。JDeveloper「HelloWorldFlow.bpel」ページが表示されます。
  9. invokeアクティビティとreplyアクティビティの間に別のassignアクティビティを追加します。
  10. assignアクティビティをダブルクリックします。
  11. 「コピー操作」タブをクリックして「コピー操作」を選択します。
  12. 左ペインで、「WriteHelloWorld_OutboundRequestReply_OutputVariable」の下にある「ns3:result」を選択します。
  13. 右ペインで、「Reply_InboundRequestReply_OutputVariable」の下にある「ns3:result」を選択して「OK」をクリックします。
  14. 「OK」をクリックします。図5-75に示すように、JDeveloper「HelloWorldFlow.bpel」ページが表示されます。

    図5-75 JDeveloper - HelloWorldFlow.bpel

    図5-75の説明が続きます
    「図5-75 JDeveloper - HelloWorldFlow.bpel」の説明
  15. 「ファイル」「すべて保存」を順番にクリックします。

5.5.1.6 JDeveloperを使用したデプロイ

前述の手順で作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次の手順を実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、JDeveloperからのJCAアダプタ・アプリケーションのデプロイを参照してください。

5.5.1.7 Oracle Enterprise Manager Fusion Middleware Controlコンソール(Fusion Middleware Controlコンソール)を使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次の手順を実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をメモします。

  3. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  4. ステップ2でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  5. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  6. ペイロード・ノードを開いてペイロード詳細を確認します。
  7. プロセス・フローを表示するには、「フロー」タブをクリックします。また、アクティビティ(invoke、receiveなど)をクリックしてアクティビティ詳細を表示します。

5.5.2 フライト情報表示システム

フライト情報表示システムの使用例では、Oracleソケット・アダプタを使用してハンドシェイクを定義する際の各種モードについて説明します。フライト情報表示サーバー(FIDS)は、特定のソース(JFKまたはSFO)からのフライトに関してフライト・ステータス情報をリクエストするFIDSクライアントにより起動されます。起動したFIDSは、3つのエアライン(Airline1、Airline 2およびAirline 3)に関するフライト・データ・リクエストを起動します。次に、受信した情報を収集し、HTTPプロトコルを使用してFIDSクライアントにリプライします。

この使用例には、次の項目が含まれます。

5.5.2.1 前提条件

この使用例を実行するには、Adapters-102SocketAdapterFlightInformationDisplaySystemサンプルに含まれているartifacts.zipファイルの次のファイルが必要です。

  • artifacts/schemas/Airline1.xsd

  • artifacts/schemas/Airline2.xsd

  • artifacts/schemas/Airline3.xsd

  • artifacts/schemas/FIDS.xsd

  • artifacts/xsl/request.xsl

  • artifacts/xsl/reply.xsl

  • artifacts/xsl/invoke.xsl

Adapters-102SocketAdapterFlightInformationDisplaySystemサンプルを入手するには、Oracle SOA Sample Codeサイトにアクセスします。

5.5.2.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成する手順は、次のとおりです。

  1. JDeveloperの「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにFIDSAppと入力して「次へ」をクリックします。「プロジェクトの名前付け」ページが表示されます。
  3. 「OK」をクリックします。「プロジェクトの名前付け」ダイアログが表示されます。
  4. 「プロジェクト名」フィールドにFIDSCompositeと入力してから「プロジェクト・テクノロジ」の下で「SOA」を選択し、右矢印をクリックして「選択済」ボックスに移動します。

    FIDSAppアプリケーションとFIDSCompositeプロジェクトが「アプリケーション・ナビゲータ」に表示されます。

  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成」ダイアログが表示されます。
  7. 「名前」フィールドにBPEL_FIDSと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-76に示すように、FIDSAppアプリケーションとFIDSCompositeプロジェクトが設計領域に表示されます。

    図5-76 JDeveloper - composite.xml

    図5-76の説明が続きます
    「図5-76 JDeveloper - composite.xml」の説明
  9. Airline1.xsdAirline2.xsdAirline3.xsdおよびFIDS.xsdファイルをプロジェクトFIDSCompositeFIDSComposite\xsdにコピーします(これらのファイルの場所は、「前提条件」を参照)。
  10. invoke.xslrequest.xslおよびreply.xslをプロジェクトFIDSCompositeFIDSComposite\xslにコピーします(これらのファイルの場所は、「前提条件」を参照)。

5.5.2.3 インバウンドOracleソケット・アダプタ・サービスの作成

次の手順を実行し、FIDSAppアプリケーションの公開に使用するインバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」から、「ソケット・アダプタ」を「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 「サービス名」フィールドにFIDSと入力します。
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
  6. 「操作タイプ」として「インバウンド同期リクエスト/リプライ」を選択します。
  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。
  8. 図5-77に示すように、「ソケット接続JNDI名」フィールドにeis/socket/InboundSocketAdapterと入力し、「ホストおよびポートの指定」を選択します。

    図5-77 「アダプタ構成ウィザード - ソケット接続」ページ

    図5-77の説明が続きます
    「図5-77 「アダプタ構成ウィザード - ソケット接続」ページ」の説明
  9. 「ポート番号」フィールドに9000と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 図5-78に示すように、「プロジェクトのスキーマ・ファイル」「FIDS.xsd」および「FIDSProcessRequest」を順番にクリックします。

    図5-78 「タイプ・チューザ」ダイアログ

    図5-78の説明が続きます
    「図5-78 「タイプ・チューザ」ダイアログ」の説明
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにFIDS.xsdファイルが移入されます。
  13. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  14. 「プロジェクトのスキーマ・ファイル」「FIDS.xsd」および「FIDSProcessReply」を順番にクリックします。
  15. 「OK」をクリックします。図5-79に示すように、「メッセージ」ページの「URL」フィールドにFIDS.xsdファイルが移入されます。

    図5-79 「アダプタ構成ウィザード - メッセージ」ページ

    図5-79の説明が続きます
    「図5-79 「アダプタ構成ウィザード - メッセージ」ページ」の説明
  16. 「次へ」をクリックします。「プロトコル」ページが表示されます。
  17. 「XSLTを使用してハンドシェイクを定義します」を選択します。
  18. 「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」アイコンをクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
  19. ファイル名として「request.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。
  20. 「ReplyXslt」フィールドの端に表示される「参照してXSLファイルを選択します」アイコンをクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
  21. ファイル名として「reply.xsl」を選択して「OK」をクリックします。図5-80に示すように、「Xslt」フィールドに移入が行われます。

    図5-80 「アダプタ構成ウィザード - プロトコル」ページ

    図5-80の説明が続きます
    「図5-80 「アダプタ構成ウィザード - プロトコル」ページ」の説明
  22. 「終了」をクリックします。「composite.xml」ページが図5-81のように表示されます。

    図5-81 JDeveloper - 「composite.xml」ページ

    図5-81の説明が続きます
    「図5-81 JDeveloper - 「composite.xml」ページ」の説明

5.5.2.4 アウトバウンドOracleソケット・アダプタ・サービスの作成

次の手順に従って、Airline1サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  2. 「次へ」をクリックします。「サービス名」ページが表示されます。

  3. 「サービス名」フィールドにAirline1と入力します。

  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

  6. 「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。

  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。

  8. 図5-82に示すように、「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapterと入力し、「ホストおよびポートの指定」を選択します。

    図5-82 「アダプタ構成ウィザード - ソケット接続」ページ

    図5-82の説明が続きます
    「図5-82 「アダプタ構成ウィザード - ソケット接続」ページ」の説明
  9. 「ホスト名」フィールドにAirline1ソケット・サーバー・プログラムを実行する必要のあるシステムの名前を入力し、「ポート番号」フィールドに9001と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

  10. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  11. 「プロジェクトのスキーマ・ファイル」「Airline1.xsd」および「Source」を順番にクリックします。

  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline1.xsdファイルが移入されます。

  13. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  14. 「プロジェクトのスキーマ・ファイル」「Airline1.xsd」および「Flight-Details」を順番にクリックします。

  15. 「OK」をクリックします。図5-83に示すように、「メッセージ」ページの「URL」フィールドにAirline1.xsdファイルが移入されます。

    図5-83 「アダプタ構成ウィザード - メッセージ」ページ

    図5-83の説明が続きます
    「図5-83 「アダプタ構成ウィザード - メッセージ」ページ」の説明
  16. 「次へ」をクリックします。「プロトコル」ページが表示されます。

  17. 「XSLTを使用してハンドシェイクを定義します」を選択します。

  18. 「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。

  19. 図5-84に示すように、「ファイル名」として「invoke.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。

    図5-84 「SOAリソース・ブラウザ」ダイアログ

    図5-84の説明が続きます
    「図5-84 「SOAリソース・ブラウザ」ダイアログ」の説明
  20. 「終了」をクリックします。「composite.xml」ページが図5-85のように表示されます。

    図5-85 JDeveloper - 「composite.xml」ページ

    図5-85の説明が続きます
    「図5-85 JDeveloper - 「composite.xml」ページ」の説明

次の手順に従って、Airline2サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  2. 「次へ」をクリックします。「サービス名」ページが表示されます。

  3. 「サービス名」フィールドにAirline2と入力します。

  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

  6. 「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。

  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。

  8. 「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapterと入力して「ホストおよびポートの指定」を選択します。

  9. 「ホスト名」フィールドにAirline2ソケット・サーバー・プログラムを実行するシステムの名前を入力し、「ポート番号」フィールドに9002と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。

  10. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  11. 「プロジェクトのスキーマ・ファイル」「Airline2.xsd」および「Source」を順番にクリックします。

  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline2.xsdファイルが移入されます。

  13. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。

  14. 「プロジェクトのスキーマ・ファイル」「Airline2.xsd」および「flight-details」を順番にクリックします。

  15. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline2.xsdファイルが移入されます。

  16. 「次へ」をクリックします。「プロトコル」ページが表示されます。

  17. 「ハンドシェイクなし」を選択します。

  18. 「終了」をクリックします。「composite.xml」ページが図5-86のように表示されます。

    図5-86 JDeveloper - 「composite.xml」ページ

    図5-86の説明が続きます
    「図5-86 JDeveloper - 「composite.xml」ページ」の説明

次の手順に従って、Airline3サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。

  1. 「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 「サービス名」フィールドにAirline3と入力します。
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
  6. 「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。
  7. 「次へ」をクリックします。「ソケット接続」ページが表示されます。
  8. 「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapterと入力して「ホストおよびポートの指定」を選択します。
  9. 「ホスト名」フィールドにAirline3ソケット・サーバー・プログラムを実行するシステムの名前を入力し、「ポート番号」フィールドに9003と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 「プロジェクトのスキーマ・ファイル」「Airline3.xsd」および「src」を順番にクリックします。
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline3.xsdファイルが移入されます。
  13. 「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  14. 「プロジェクトのスキーマ・ファイル」「Airline3.xsd」および「airline」を順番にクリックします。
  15. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline3.xsdファイルが移入されます。
  16. 「次へ」をクリックします。「プロトコル」ページが表示されます。
  17. 「カスタムJavaコードを使用してハンドシェイクを定義します」を選択します。
  18. 「Javaクラス」フィールドにcom.oracle.socket.fids.custom.Airline3Customと入力します。
  19. 「終了」をクリックします。「composite.xml」ページが図5-87のように表示されます。

    図5-87 JDeveloper - 「composite.xml」ページ

    図5-87の説明が続きます
    「図5-87 JDeveloper - 「composite.xml」ページ」の説明

5.5.2.5 サービスとアクティビティのワイヤリング

作成したコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続する手順は、次のとおりです。

  1. 「公開されたサービス」領域にあるFIDSクライアント内の小さい三角形を、「コンポーネント」領域のBPEL_FIDSプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPEL_FIDSプロセス内の小さい三角形を、「外部参照」領域のAirline1、Airline2およびAirline3サーバー内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xmlファイルが図5-88のように表示されます。

    図5-88 JDeveloper - composite.xml

    図5-88の説明が続きます
    「図5-88 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.2.5.1 receiveアクティビティの追加
  1. 「BPEL_FIDS」をダブルクリックします。「BPELFIDS.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドでデフォルト名のReceive_1を保持します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 図5-89に示すように、「FIDS」を選択して「OK」をクリックします。

    図5-89 「パートナ・リンク・チューザ」ダイアログ

    図5-89の説明が続きます
    「図5-89 「パートナ・リンク・チューザ」ダイアログ」の説明
  7. 図5-90に示すように、「Receive」ダイアログで「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    図5-90 「Receive」ダイアログ

    図5-90の説明が続きます
    「図5-90 「Receive」ダイアログ」の説明
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。図5-91に示すように、JDeveloperの「BPEL_FIDS.bpel」ページが表示されます。

    図5-91 JDeveloper - BPEL_FIDS.bpel

    図5-91の説明が続きます
    「図5-91 JDeveloper - BPEL_FIDS.bpel」の説明
5.5.2.5.2 replyアクティビティの追加
  1. 図5-92に示すように、「コンポーネント」ウィンドウから設計領域にreplyアクティビティをドラッグ・アンド・ドロップします。

    図5-92 JDeveloper - BPEL_FIDS.bpel

    図5-92の説明が続きます
    「図5-92 JDeveloper - BPEL_FIDS.bpel」の説明
  2. replyアクティビティをダブルクリックします。「Reply」ダイアログが表示されます。
  3. 「名前」フィールドでデフォルト名のReply_1を保持します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 図5-89に示すように、「FIDS」を選択して「OK」をクリックします。
  6. 「Reply」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。図5-93に示すように、「変数」フィールドにデフォルトの変数名が移入されます。

    図5-93 「Reply」ダイアログ

    図5-93の説明が続きます
    「図5-93 「Reply」ダイアログ」の説明
  8. 「OK」をクリックします。図5-94に示すように、JDeveloper「BPEL_FIDS.bpel」ページが表示されます。

    図5-94 JDeveloper - BPEL_FIDS.bpel

    図5-94の説明が続きます
    「図5-94 JDeveloper - BPEL_FIDS.bpel」の説明
5.5.2.5.3 flowアクティビティの追加
  1. 図5-95に示すように、設計領域で、receiveアクティビティとreplyアクティビティの間に「コンポーネント」ウィンドウからflowアクティビティをドラッグ・アンド・ドロップします。

    図5-95 JDeveloper - BPEL_FIDS.bpel

    図5-95の説明が続きます
    「図5-95 JDeveloper - BPEL_FIDS.bpel」の説明
  2. Flow_1アクティビティを開きます。シーケンスの作成画面が表示されます。
5.5.2.5.4 Airline1サーバーのフローの設計
  1. 図5-96に示すように、「コンポーネント」ウィンドウからSequence_1にswitchアクティビティをドラッグ・アンド・ドロップします。

    図5-96 JDeveloper - 「BPEL_FIDS.bpel」ページ

    図5-96の説明が続きます
    「図5-96 JDeveloper - 「BPEL_FIDS.bpel」ページ」の説明
  2. switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。

  3. 図5-97に示すように、「<case>」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。

    図5-97 JDeveloper - 「BPEL_FIDS.bpel」ページ

    図5-97の説明が続きます
    「図5-97 JDeveloper - 「BPEL_FIDS.bpel」ページ」の説明
  4. ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。

  5. 図5-98に示すように、式としてboolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline1')と入力し、「OK」をクリックします。

    画面が「条件式」ポップアップ・ウィンドウに戻ります。

    注意:

    この式により、Airline1の情報がリクエストされた場合にのみ、このフローが確実に実行されます。

    図5-98 「式ビルダー」ダイアログ

    図5-98の説明が続きます
    「図5-98 「式ビルダー」ダイアログ」の説明
  6. 「<case>」セクションにinvokeアクティビティを追加します。

    1. invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。

    2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。

    3. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。

    4. 「Airline1」を選択して「OK」をクリックします。

    5. 「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    6. デフォルトの変数名を選択して「OK」をクリックします。「変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。

    7. 「OK」をクリックします。図5-99に示すように、JDeveloper「BPEL_FIDS.bpel」ページが表示されます。

    図5-99 JDeveloper - BPEL_FIDS.bpel

    図5-99の説明が続きます
    「図5-99 JDeveloper - BPEL_FIDS.bpel」の説明
  7. 「<case>」セクションにassignアクティビティを追加します。

    1. <case>セクションで、Invoke_1アクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。

    2. Assign_1アクティビティをダブルクリックします。Assignダイアログが表示されます。

    3. 「コピー操作」タブをクリックします。Assignダイアログが表示されます。

    4. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。

    5. 図5-100に示すように、Receive_1アクティビティの入力変数のソースとInvoke_1アクティビティの入力変数のソースの間にコピー操作を作成します。

      図5-100 「コピー操作の作成」ダイアログ

      図5-100の説明が続きます
      「図5-100 「コピー操作の作成」ダイアログ」の説明
    6. ダイアログで「OK」をクリックします。「コピー操作の作成」ダイアログが表示されます。

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

    図5-101に示すように、「BPEL_FIDS.bpel」ページが表示されます。

    図5-101 JDeveloper - BPELFIDS.bpel

    図5-101の説明が続きます
    「図5-101 JDeveloper - BPELFIDS.bpel」の説明
  8. 「<case>」セクションにtransformアクティビティを追加します。

    1. transformアクティビティを「<case>」セクションのInvoke_1アクティビティの後にドラッグ・アンド・ドロップします。

    2. transformアクティビティをダブルクリックします。

    3. 「トランスフォーメーション」タブをクリックします。

    4. 「作成... (Alt + N)」アイコンをクリックします。「ソース変数」ダイアログが表示されます。

    5. 「ソース変数」リストから「Invoke_1_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。

    6. 「ターゲット変数」リストから「Reply_1_InboundRequestReply_OutputVariable」を選択します。

    7. 「OK」をクリックします。XSLマッパー・ツールが表示されます。

    8. 左ペインのソースから、「tns:Flight」ノードを右ペインにあるターゲットの「FlightDetails」ノードにリンクします。「自動マップ・プリファレンス」ダイアログが表示されます。

    9. 「OK」をクリックします。図5-102に示すように、「Transformation_1.xsl」(XSLマッパー・ツール)が表示されます。

      図5-102 JDeveloper - 「Transformation_1.xsl」ページ

      図5-102の説明が続きます
      「図5-102 JDeveloper - 「Transformation_1.xsl」ページ」の説明
  9. 「ファイル」「すべて保存」を順番にクリックします。図5-103に示すように、Airline1サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。

    図5-103 JDeveloper - BPEL_FIDS.bpel

    図5-103の説明が続きます
    「図5-103 JDeveloper - BPEL_FIDS.bpel」の説明
5.5.2.5.5 Airline2サーバーのフローの設計
  1. 空のsequenceアクティビティをダブルクリックし、「名前」フィールドにSequence_2と入力します。

  2. 「コンポーネント」ウィンドウからSequence_2にswitchアクティビティをドラッグ・アンド・ドロップします。

  3. switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。

  4. <case>」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。

  5. ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。

  6. 式としてboolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline2')と入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。

    注意:

    この式により、Airline2の情報がリクエストされた場合にのみ、このフローが確実に実行されます。

  7. 「<case>」セクションにinvokeアクティビティを追加します。

    1. invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。

    2. Invoke_2アクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。

    3. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。

    4. 「Airline2」を選択して「OK」をクリックします。

    5. 「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    6. デフォルトの変数名を選択して「OK」をクリックします。「入力変数」および「出力変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。

    7. 「OK」をクリックします。invokeアクティビティがJDeveloper「BPEL_FIDS.bpel」ページのSequence_2の下に追加されます。

  8. 「<case>」セクションにassignアクティビティを追加します。

    1. <case>セクションで、invokeアクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。

    2. Assign_2アクティビティをダブルクリックします。Assignダイアログが表示されます。

    3. 「コピー操作」タブをクリックします。Assignダイアログが表示されます。

    4. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。

    5. 図5-104に示すように、Receive_1アクティビティの入力変数のソースとInvoke_2アクティビティの入力変数のソースの間にコピー操作を作成します。

      図5-104 「コピー操作の作成」ダイアログ

      図5-104の説明が続きます
      「図5-104 「コピー操作の作成」ダイアログ」の説明
    6. 「コピー操作の作成」ダイアログで「OK」をクリックします。

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

  9. 一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。

    注意:

    一時変数は、Airline2サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。

    1. (x)で表された「変数」アイコンをクリックします。図5-105に示すように、「変数」ダイアログが表示されます。

      図5-105 「変数」ダイアログ

      図5-105の説明が続きます
      「図5-105 「変数」ダイアログ」の説明
    2. 「作成」アイコンをクリックします。図5-106に示すように、「変数の作成」ダイアログが表示されます。

      図5-106 「変数の作成」ダイアログ

      図5-106の説明が続きます
      「図5-106 「変数の作成」ダイアログ」の説明
    3. 変数タイプとして「メッセージ・タイプ」を選択します。

    4. 「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。

    5. 図5-107に示すように、「メッセージ・タイプ」「パートナ・リンク」「FIDS」「FIDS.wsdl」「メッセージ・タイプ」および「FIDSProcessReply_msg_reply」を順番にクリックします。

      図5-107 「タイプ・チューザ」ダイアログ

      図5-107の説明が続きます
      「図5-107 「タイプ・チューザ」ダイアログ」の説明
    6. 「OK」をクリックします。「変数の作成」ダイアログの「メッセージ・タイプ」フィールドにFIDSProcessReply_msg_replyパートナ・リンクが移入されます。

    7. 「OK」をクリックします。「変数」ダイアログの「変数」リストに「メッセージ・タイプ」タイプの変数Variable_1が追加されます。

    8. 「OK」をクリックして「BPEL_FIDS.bpel」ページに戻ります。

    9. transformアクティビティを「<case>」セクションのInvoke_2アクティビティの後にドラッグ・アンド・ドロップします。

    10. Transform_2アクティビティをダブルクリックします。

    11. 「トランスフォーメーション」タブをクリックします。

    12. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。

    13. 「ソース変数」リストから「Invoke_2_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。

    14. 「ターゲット変数」リストで「Variable_1」を選択します。

    15. 「OK」をクリックします。XSLマッパー・ツールが表示されます。

    16. 左ペインのソースから、「tns:Flight」ノードを右ペインにあるターゲットの「FlightDetails」ノードにリンクします。図5-108に示すように、「自動マップ・プリファレンス」ダイアログが表示されます。

      図5-108 「自動マップ・プリファレンス」ダイアログが表示されている「Transformation_2.xsl」ページ

      図5-108の説明が続きます
      「図5-108 「自動マップ・プリファレンス」ダイアログが表示されている「Transformation_2.xsl」ページ」の説明
    17. 「OK」をクリックします。XSLマッピングを含むTransformation_2.xsl (XSLマッパー・ツール)ファイルが表示されます。

  10. 「ファイル」「すべて保存」を順番にクリックします。

    図5-109に示すように、Airline2サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。

    図5-109 JDeveloper - BPEL_FIDS.bpel

    図5-109の説明が続きます
    「図5-109 JDeveloper - BPEL_FIDS.bpel」の説明
5.5.2.5.6 Airline3サーバーのフローの設計
  1. Flow_1アクティビティを右クリックします。メニューから「シーケンスの追加」をクリックします。Sequence_3が追加されます。

  2. 「コンポーネント」ウィンドウからSequence_3にswitchアクティビティをドラッグ・アンド・ドロップします。

  3. switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。

  4. <case>」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。

  5. ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。

  6. 式としてboolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline3')と入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。

    注意:

    この式により、Airline3の情報がリクエストされた場合にのみ、このフローが確実に実行されます。

  7. 「<case>」セクションにinvokeアクティビティを追加します。

    1. invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。

    2. Invoke_3アクティビティをダブルクリックします。Invokeダイアログが表示されます。

    3. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。

    4. 「Airline3」を選択して「OK」をクリックします。

    5. 「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    6. デフォルトの変数名を選択して「OK」をクリックします。「入力変数」および「出力変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。

    7. 「OK」をクリックします。invokeアクティビティがJDeveloper「BPEL_FIDS.bpel」ページのSequence_3の下に追加されます。

  8. 「<case>」セクションにassignアクティビティを追加します。

    1. <case>セクションで、invokeアクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。

    2. Assign_3アクティビティをダブルクリックします。Assignダイアログが表示されます。

    3. 「コピー操作」タブをクリックします。Assignダイアログが表示されます。

    4. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。

    5. 図5-110に示すように、Receive_1アクティビティの入力変数のソースとInvoke_3アクティビティの入力変数のソースの間にコピー操作を作成します。

      図5-110 「コピー操作の作成」ダイアログ

      図5-110の説明が続きます
      「図5-110 「コピー操作の作成」ダイアログ」の説明
    6. 「コピー操作の作成」ダイアログで「OK」をクリックします。

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

  9. 一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。

    注意:

    一時変数は、Airline3サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。

    1. (x)で表された「変数」アイコンをクリックします。図5-111に示すように、「変数」ダイアログが表示されます。

      図5-111 「変数」ダイアログ

      図5-111の説明が続きます
      「図5-111 「変数」ダイアログ」の説明
    2. 「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    3. 変数タイプとして「メッセージ・タイプ」を選択します。

    4. 「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。

    5. 図5-107に示すように、「メッセージ・タイプ」「パートナ・リンク」「FIDS」「FIDS.wsdl」「メッセージ・タイプ」および「FIDSProcessReply_msg_reply」を順番にクリックします。

    6. 「OK」をクリックします。「変数の作成」ダイアログの「メッセージ・タイプ」フィールドにFIDSProcessReply_msg_replyパートナ・リンクが移入されます。

    7. 「OK」をクリックします。「変数」ダイアログの「変数」リストに「メッセージ・タイプ」タイプの変数Variable_2が追加されます。

    8. 「OK」をクリックして「BPEL_FIDS.bpel」ページに戻ります。

    9. transformアクティビティを「<case>」セクションのInvoke_3アクティビティの後にドラッグ・アンド・ドロップします。

    10. Transform_3アクティビティをダブルクリックします。

    11. 「トランスフォーメーション」タブをクリックします。

    12. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。

    13. 「ソース変数」リストから「Invoke_3_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。

    14. 「ターゲット変数」リストで「Variable_2」を選択します。

    15. 「OK」をクリックします。XSLマッパー・ツールが表示されます。

    16. 左ペインのソースから、「tns:Flight」ノードを右ペインにあるターゲットの「FlightDetails」ノードにリンクします。「自動マップ・プリファレンス」ダイアログが表示されます。

    17. 「OK」をクリックします。図5-112に示すように、XSLマッピングを含むTransformation_3.xsl (XSLマッパー・ツール)ファイルが表示されます。

      図5-112 「Transformation_3.xsl」ページ

      図5-112の説明が続きます
      「図5-112 「Transformation_3.xsl」ページ」の説明
  10. 「ファイル」「すべて保存」を順番にクリックします。図5-113に示すように、Airline3サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。

    図5-113 JDeveloper - BPEL_FIDS.bpel

    図5-113の説明が続きます
    「図5-113 JDeveloper - BPEL_FIDS.bpel」の説明
5.5.2.5.7 assignアクティビティの追加
  1. 設計領域で、replyアクティビティとreceiveアクティビティの間に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。
  2. Assign_4アクティビティをダブルクリックします。「Assign」ダイアログが表示されます。
  3. 「コピー操作」タブをクリックします。図5-114に示すように、Assignダイアログが表示されます。

    図5-114 「Assign」ダイアログ - 「コピー操作」タブ

    図5-114の説明が続きます
    「図5-114 「Assign」ダイアログ - 「コピー操作」タブ」の説明
  4. 「追加操作」を選択します。「追加操作の作成」ダイアログが表示されます。
  5. 図5-115に示すように、一時変数Variable_1に格納されている情報をリプライ変数Reply_1_InboundRequestReply_OutputVariableに追加する追加操作を作成します。

    図5-115 「追加操作の作成」ダイアログ

    図5-115の説明が続きます
    「図5-115 「追加操作の作成」ダイアログ」の説明
  6. 「OK」をクリックします。「Assign」ダイアログが表示されます。
  7. 「追加操作」を選択します。「追加操作の作成」ダイアログが表示されます。
  8. 図5-116に示すように、一時変数Variable_2に格納されている情報をリプライ変数Reply_1_InboundRequestReply_OutputVariableに追加する、別の追加操作を作成します。

    図5-116 「追加操作の作成」ダイアログ

    図5-116の説明が続きます
    「図5-116 「追加操作の作成」ダイアログ」の説明
  9. 「OK」をクリックします。Assignダイアログが表示されます。
  10. 「OK」をクリックします。図5-117に示すように、JDeveloper「BPEL_FIDS.bpel」ページが表示されます。

    図5-117 JDeveloper - HelloWorldFlow.bpel

    図5-117の説明が続きます
    「図5-117 JDeveloper - HelloWorldFlow.bpel」の説明
  11. 「ファイル」「すべて保存」を順番にクリックします。

5.5.2.6 JDeveloperを使用したデプロイ

前述の手順で作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次の手順を実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、JDeveloperからのJCAアダプタ・アプリケーションのデプロイを参照してください。

ServerおよびClient Javaプログラムを実行して、アプリケーションをテストする必要があります。詳細は、関連するREADMEファイルを参照してください。

5.5.2.7 Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次の手順を実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をメモします。

  3. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  4. ステップ2でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  5. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  6. ペイロード・ノードを開いてペイロード詳細を確認します。
  7. プロセス・フローを表示するには、「フロー」タブをクリックします。また、アクティビティ(invoke、receiveなど)をクリックしてアクティビティ詳細を表示します。

5.5.3 ソケット・アダプタのクラスタ・サポート

クラスタ化環境とは、単一のIPアドレスを持つ単一のマシンで複数の管理対象サーバーが実行される環境のことです。インバウンドOracleソケット・アダプタをクラスタ化環境にデプロイしようとすると、管理対象サーバーの1つで、サーバーのポートがすでに使用されているというエラー・メッセージが表示されます。

ただし、ソケット・アダプタではクラスタ化環境のサポートが提供されています。クラスタ化環境で例外をスローしないようにソケット・アダプタを構成できます。

垂直クラスタ環境でのみ、単一の物理マシン上で複数の管理対象サーバーを実行できることに注意してください。水平クラスタ環境では、これは該当しません。

垂直クラスタ・トポロジには、カンマ区切りのポートが必要です。

5.5.3.1 ソケット・アダプタをクラスタ化環境で使用するための構成

ソケット・アダプタをクラスタ化環境で使用するように構成するには、該当するコネクション・ファクトリ内で、ソケット・アダプタが使用するポートをカンマ区切りリストで指定する必要があります。

ポートのカンマ区切りリストを構成すると、アダプタはリスト内の最初のポートでサーバー・ソケットを開始しようとします。

ソケット・アダプタは、サーバー・ソケットの開始に失敗すると、リスト内の次のポートを試行します。ソケット・アダプタは、いずれかのポートでサーバー・ソケットを開始するまで、引き続きソケットの開始を試行します。

指定したいずれのポートでもサーバー・ソケットを開始できない場合、ソケット・アダプタはoracle.tip.adapter.socket.SocketServerCreationExceptionをスローします。

5.5.3.1.1 Coherenceによるパフォーマンスの最適化

ソケット・アダプタは、Coherenceレイヤーを使用してポート・リストからポートを取得します。管理対象サーバー上のインバウンド・ソケット・アダプタの各インスタンスは、リストからポートをフェッチし、フェッチしたポートをソケット・アダプタの他のインスタンスから見えないようにします。

インバウンド・ソケット・アダプタは、フェッチしたポートを正常に開いた場合、フェッチしたポートをリストから削除します。

それ以外の場合、フェッチしたポートはインバウンド・ソケット・アダプタの他のインスタンスから可視になります。管理対象サーバー上のインバウンド・ソケット・アダプタの他のインスタンスは、リストの同じポートを開こうとしません。

5.5.3.1.2 クラスタ化環境でソケット・アダプタのサポートを有効化するための、JNDIコネクション・ファクトリの「ポート」プロパティの更新

クラスタ化環境でソケット・アダプタのサポートを有効化するには、インバウンド・ソケット・アダプタに対してポートのリストを指定する必要があります。リストを指定するには、図5-118に示すように、WebLogicコンソールを開き、ポートのカンマ区切り値でJNDIコネクション・ファクトリの「ポート」プロパティを更新する必要があります。

図5-118 インバウンド・ソケット・アダプタに対するインバウンド・ポートのリストの指定

図5-118の説明が続きます
「図5-118 インバウンド・ソケット・アダプタに対するインバウンド・ポートのリストの指定」の説明