6 ソケット用のOracle JCAアダプタ
6.1 Oracleソケット・アダプタの概要
Oracleソケット・アダプタはJCA 1.5準拠のアダプタであり、TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化に使用されます。Oracleソケット・アダプタを使用すると、クライアントまたはサーバー・ソケットの作成や、接続の確立が可能です。テキストまたはバイナリのデータを転送できます。
6.1.1 Oracleソケット・アダプタのアーキテクチャ
Oracleソケット・アダプタは、JCA 1.5アーキテクチャに基づいています。JCAでは、異機種間のエンタープライズ情報システム(EIS)の統合に標準アーキテクチャを提供します。Oracleソケット・アダプタのJCAバインディング・コンポーネントでは、基礎となるJCA相互作用がOracle BPEL PM統合のサービス(JCAバインディングを使用したWSDL
)として公開されています。図6-1に、Oracleソケット・アダプタのアーキテクチャを示します。Oracle JCAアダプタのアーキテクチャの詳細は、「アーキテクチャ」を参照してください。
6.1.2 Oracleソケット・アダプタとメディエータの統合
Oracleソケット・アダプタは、自動的にメディエータと統合されます。JDeveloperデザイナでOracle Sockeアダプタ・サービスを作成すると、アダプタ構成ウィザードが起動します。このウィザードでOracleソケット・アダプタを構成できます。構成が完了すると、Oracle JDeveloper (JDeveloper)の「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。
アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。
Oracle JCAアダプタとメディエータの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。
6.1.3 Oracleソケット・アダプタとOracle BPEL PMの統合
Oracleソケット・アダプタは、自動的にOracle BPEL PMと統合されます。Oracle JDeveloperの「コンポーネント」ウィンドウからソケット・アダプタをドラッグ・アンド・ドロップすると、Oracleソケット・アダプタの構成に役立つアダプタ構成ウィザードが起動します。
構成が完了すると、JDeveloperの「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。
アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。
Oracle JCAアダプタとOracle BPEL PMの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。
6.1.4 Oracleソケット・アダプタとSOAコンポジットの統合
コンポジットは、設計されて単一アプリケーションにデプロイされるサービス、サービス・コンポーネント(Oracle BPEL PMおよびメディエータ)、ワイヤおよび参照のアセンブリです。コンポジットにより、メッセージに記述された情報が処理されます。コンポジットの詳細は、composite.xml
ファイルに格納されます。Oracleソケット・アダプタとSOAコンポジットの統合の詳細は、「Oracle SOAコンポジットとアダプタの統合」を参照してください。
6.2 Oracleソケット・アダプタの機能
Oracleソケット・アダプタを使用すると、TCP/IPソケットを介してデータの読取りおよび書込みをするようにBPELプロセスまたはメディエータ・サービスを構成できます。
Oracleソケット・アダプタには次の特徴があります。
-
TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化が可能
-
インバウンドとアウトバウンドの両方の通信をサポート
-
複雑なプロトコル・ハンドシェイクをXSLで宣言的にモデル化可能
-
プロトコル・ハンドシェイクのモデル化にカスタムJavaコードのプラグインを選択可能
-
アダプタがトランスレータ・インフラストラクチャ(NXSD)と統合されているため、ソケットを介したネイティブ・データの読取りおよび書込みをサポート
-
複数のキャラクタ・エンコーディングをサポート
6.3 Oracleソケット・アダプタの概念
Oracleソケット・アダプタの考え方を概観します。
6.3.1 通信モード
Oracleソケット・アダプタでは、ソケットを介したインバウンドおよびアウトバウンドの通信(単方向または双方向)をサポートしています。Oracleソケット・アダプタの通信モードは、次の各項で説明します。
6.3.1.1 インバウンド同期リクエスト/レスポンス
インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。Oracleソケット・アダプタでは次に、同じ接続を使用してレスポンスを同期的に返信します。
図6-2に、インバウンド同期リクエスト/レスポンスのシナリオを示します。
6.3.1.2 アウトバウンド同期リクエスト/レスポンス
アウトバウンド同期リクエスト/レスポンスの場合、リクエストはBPELまたはメディエータから行われます。Oracleソケット・アダプタはサーバー・ソケットに接続し、リクエスト・メッセージをサーバー・ソケットに出力ストリームで送信します。Oracleソケット・アダプタは次に、サーバー・ソケットからのレスポンスを入力ストリームでブロックし、レスポンスをBPELまたはメディエータに返信します。
図6-3に、アウトバウンド同期リクエスト/レスポンスのシナリオを示します。
6.3.1.3 インバウンド受信
インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。このシナリオでは、リプライは送信されません。
6.3.2 プロトコル定義メカニズム
通信プロトコルまたはハンドシェイクは、認証手順、確認、状況に応じたデータの送受信など、異なる個別のステップで構成されます。Oracleソケット・アダプタでは、プロトコル・ハンドシェイクを定義する次の各メカニズムをサポートしています。
6.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
このメソッドを、ソケットの出力ストリームへの書込みに使用できます。
図6-4に示すXSLTは、StyleReaderを使用する拡張関数の使用方法を示しています。
-
-
入力および出力変数を定義するスキーマに注釈を付け、NXSD構成メンバーを使用して、次のメソッドでソケット・ストリームからの読取りおよび書込みを行います。
-
socketReadWithXlation():DocumentFragment
このメソッドを、入力用に構成されたスキーマおよびスキーマ要素を使用した、ソケットの入力ストリームからの読取りに使用できます。
-
socketWriteWithXlation(xml:NodeList)
このメソッドを、出力用に構成されたスキーマを使用した、ソケットの出力ストリームへの書込みに使用できます。
図6-5に示すXSDファイルは、NXSD構成メンバーを使用して、入力および出力変数を定義するスキーマに注釈を付け、拡張関数の使用方法を示しています。
-
スタイルシートを使用してハンドシェイクを定義するには、図6-6に示すように、「プロトコル」ページで「XSLTを使用してハンドシェイクを定義します」を選択し、参照してXSLファイルを選択する必要があります。
6.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(); }
次に完全な例を示します。コンパイルするには、bpm-infra.jar
およびxmlparserv2.jar
が必要です。これらのJARは、次の場所にあります:
$SOA_ORACLE_HOME/soa/soa/modules/oracle.soa.fabric_11.1.1/bpm-infra.jar
$SOA_ORACLE_HOME/oracle_common/modules/oracle.xdk/xmlparserv2.jar
import java.io.BufferedReader; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringReader; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import oracle.tip.pc.services.translation.util.ICustomParser; import oracle.xml.parser.v2.DOMParser; public class SocketAdapterCustomCode implements ICustomParser { String enc = "UTF-8"; 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 { 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 { 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コードを使用してハンドシェイクを定義するには、図6-7に示すように、「カスタムJavaコードを使用してハンドシェイクを定義します」を選択し、「Javaクラス」フィールドでハンドシェイクを実装するJavaクラスを指定する必要があります。
6.3.2.3 ハンドシェイク・メカニズムを持たないプロトコル
Oracleソケット・アダプタは、ソケットのI/Oストリームとの間の変換に関連するハンドシェイクを必要としないプロトコルを使用するように構成できます。
ハンドシェイクを必要としないプロトコルを使用するには、図6-8に示すように、「プロトコル」ページで「ハンドシェイクなし」を選択する必要があります。
6.3.3 キャラクタ・エンコーディングとバイト順
「エンコーディング」プロパティはネイティブ・データの格納に使用されるキャラクタ・エンコーディングを表し、「バイト順」プロパティはネイティブ・データのバイト順(BIG_ENDIAN
またはLITTLE_ENDIAN
)です。
キャラクタ・エンコーディングとバイト順は、ネイティブ・フォーマット・ビルダー・ウィザードを使用してスキーマ・ファイル(NXSD)内で指定できます。また、使用するエンコーディングとバイト順をアダプタ構成ウィザードで指定することもできます。エンコーディングとバイト順を指定しない場合、デフォルト値はUS-ASCII
とBIG_ENDIAN
です。
変換を使用する場合にのみ適用可能なエンコーディングとバイト順の値を指定するには、アダプタ構成ウィザードの「プロトコル」ページで次のステップを実行する必要があります。
-
図6-9に示すように、「プロトコル」ページの「エンコーディング/バイト順」セクションで「エンコーディング/バイト順の指定」オプションを選択します。
-
次のいずれかのタスクを実行してエンコーディングを設定します。
-
スキーマ・ファイルで指定されたエンコーディングを使用するには、「エンコーディング」の選択を解除したままにします。
-
アダプタ構成ウィザードを使用してエンコーディングを指定するには、「エンコーディング」を選択し、「エンコーディング」リストからエンコーディング・タイプを選択します。
ノート:
「エンコーディング」を選択した場合、アダプタ構成ウィザードを使用して指定したエンコーディング・タイプがNXSDファイル内で指定されているエンコーディング・タイプよりも優先されます。
-
-
次のいずれかのタスクを実行してバイト順を設定します。
-
スキーマ・ファイルで指定したバイト順を使用するには、「スキーマからバイト順の値を使用します」を選択します。
-
アダプタ構成ウィザードを使用してバイト順を指定するには、「バイト順」を選択し、「バイト順」リストからバイト順を選択します。
-
-
「終了」をクリックします。「終了」をクリックした後で、構成ウィザードに、ソケット・アダプタの構成が完了したことを示すページが表示されます。
6.3.4 パフォーマンス・チューニング
Oracleソケット・アダプタでは、次のパフォーマンス・チューニング機能がサポートされています。
詳細は、「Oracle JCAアダプタ・チューニング・ガイド」および「Oracle JCAアダプタのプロパティ」を参照してください。
6.3.4.1 Oracleソケット・アダプタの接続プーリングの構成
Oracleソケット・アダプタのパフォーマンスを最適化する方法の1つとして、接続プールの使用があります。接続先のソケット・サーバーが相互作用のたびにソケットを閉じないかぎり、接続プールを使用できます。接続プールを使用すると、ソケット接続を繰り返し使用でき、相互作用のたびに新規のソケットを作成するオーバーヘッドを回避できます。Oracleソケット・アダプタの接続プールは、Oracle WebLogic Serverコンソールを使用して構成する必要があります。
ノート:
接続プール機能は、アウトバウンドの対話にのみ適用できます。
6.3.4.1.1 Oracleソケット・アダプタの接続プーリングの構成方法
ノート:
接続プール・パラメータは、Oracle WebLogic Server管理コンソールの「接続プール」タブを使用して変更できます。
Initial capacity=0
Max capacity=200
Test on Create=false
Test on Create=true
に変更すると、エンドポイントEISへのリソース・アダプタ接続がテストされます。SocketAdapterはダミー・メッセージを送信してソケットを接続し、接続を確認します。この処理により、例外状態になります。
6.4 Oracleソケット・アダプタの構成
この項の情報を使用して、Oracleソケット・アダプタを構成します。
6.4.1 weblogic-ra.xmlファイルの変更
Oracleソケット・アダプタを構成するには、表6-1にリストされているプロパティの値をweblogic-ra.xml
ファイルに指定する必要があります。これらのプロパティはOracle WebLogic Server管理コンソールから更新できます。詳細は、「アダプタ・コネクション・ファクトリの追加」を参照してください。
表6-1 Oracleソケット・アダプタの構成プロパティ
プロパティ | 説明 |
---|---|
Host |
アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、接続先となるシステム名。インバウンド相互作用の場合は、常に |
Port |
アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、アダプタの接続先となるポート番号です。インバウンド相互作用の場合は、着信接続をソケット・アダプタがリスニングするポート番号です。 |
Timeout |
この値がゼロ以外のタイムアウト間隔に設定されている場合、このソケットに関連付けられているInputStreamに対する |
KeepAlive |
アウトバウンド相互作用の場合にのみ適用可能。接続プール機能を使用するには、 |
BacklogQueue |
インバウンド相互作用の場合に適用可能。この値は、着信接続指示(接続リクエスト)の最大キュー長さを示します。キューが一杯のときに接続指示が到着すると、接続は拒否されます。 |
ノート:
Oracleリリース11gからリリース12cにアップグレードすると、ServerSocketを作成する際の動作が変更されます。このため、hostname
がlocalhost
として構成されていると、リモート・クライアントはServerSocketに接続できなくなる可能性があります。回避策として、localhost
をhostname
に変更してください。
サンプルの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
に設定する必要があります。
6.4.2 ハンドシェイクのモデル化
クライアントまたはサーバー・ソケットと接続をネゴシエートするには、ハンドシェイクが必要な場合があります。
6.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>
6.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>
6.4.3 XSLマッパー・ツールを使用したXSLファイルの設計
Oracleソケット・アダプタの場合、XSLマッパー・ツールを使用してXSLファイルを設計できます。次の各項では、様々な通信シナリオに使用するXSLの設計手順について説明します。
6.4.3.1 インバウンド同期リクエスト/リプライに使用するXSLの設計
この項では、XSLマッパー・ツールを使用してインバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。
この使用例を実行するには、まず次のファイルを作成する必要があります:
-
HelloWorld.xsd
HelloWorld.xsd
の内容
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/HelloWorld"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="HelloWorldProcessRequest">
<complexType>
<sequence>
<element name="input" type="string"/>
</sequence>
</complexType>
</element>
<element name="HelloWorldProcessResponse">
<complexType>
<sequence>
<element name="result" type="string"/>
</sequence>
</complexType>
</element>
</schema>
このファイルをHelloWorldComposite
プロジェクトのHelloWorldComposite\xsd
フォルダにコピーします。
6.4.3.1.1 SOAコンポジットの設計
SOAコンポジットを設計するには、SOAコンポジットの設計で説明するステップを実行します。
ノート:
示されているステップは、Oracle BPEL PMを使用するコンポジットに適用可能です。または、Oracle Mediatorでコンポジットを作成することもできます。
6.4.3.1.2 インバウンドOracleソケット・アダプタの作成
インバウンドOracleソケット・アダプタ・サービスを作成するステップは、次のとおりです。
-
「コンポーネント・パレット」から、「ソケット・アダプタ」を「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
「サービス名」フィールドにサービス名として
HelloWorld
を入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。 -
「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
-
「操作タイプ」として「インバウンド同期リクエスト/リプライ」を選択し、「次へ」をクリックします。「ソケット接続」ページが表示されます。
-
「ソケット接続JNDI名」フィールドに
eis/socket/InboundSocketAdapter
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。 -
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
-
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
-
「次へ」をクリックします。「プロトコル」ページが表示されます。
-
「XSLTを使用してハンドシェイクを定義します」を選択します。
-
「XSLT」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。
-
デフォルト値のrequest.xslを使用し、「OK」をクリックします。
-
「ReplyXslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。
-
XSLファイル名としてデフォルト値のreply.xslを使用し、「OK」をクリックします。
-
「終了」をクリックします。request.xslおよびreply.xslファイルが作成されます。
図6-19に、「request.xsl」ページを示します。
ノート:
「
request.xsl
」ページの左側にある「ソース」ペインにはdummy.xsd
ファイルが表示され、これがXSLマッパー・ツールのソースとして使用されます。インバウンド・リクエスト・シナリオの場合、Oracleソケット・アダプタはソケットが受信するネイティブ・データを読み取ってXMLフォーマットに変換します。つまり、ソース側にXMLファイルはありません。XSLTマッパーは常にソースおよびターゲットXSDファイルを必要とするため、マッパー・ツールにはダミーのXSDファイルが表示されます。
図6-20に、「
reply.xsl
」ページを示します。ノート:
「
reply.xsl
」ページの右側にあるターゲット・ペインには、dummy.xsd
ファイルが表示されます。このdummy.xsd
ファイルは、XSLマッパー・ツールのターゲットとして使用されます。 -
インバウンド同期リクエスト/リプライ操作のリクエスト部分を次の手順で定義します。
-
request.xslページで、「コンポーネント・パレット」の「拡張関数」リストからsocketReadを中央ペインにドラッグ・アンド・ドロップします。
-
socketRead拡張関数をダブルクリックします。「関数の編集 - socketRead」ダイアログが表示されます。
-
nxsdStyleおよびnxsdStyleAttributesフィールドに関数パラメータを入力します。
ノート:
socketRead
関数は、NXSDフレームワークで公開されているStyleReader
を使用してソケットの入力ストリームから読み取ります。 -
「OK」をクリックします。「request.xsl」(XSLマッパー・ツール)ページが表示されます。
-
中央ペインにある
sockRead
関数を、右ペインにあるターゲットinput
ノードにリンクします。XSLマッピングを含むrequest.xsl (XSLマッパー・ツール)が表示されます。
-
-
インバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。
-
「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。
-
「reply.xsl」ページで、「コンポーネント」ウィンドウの「拡張関数」リストからsocketWriteを中央ペインにドラッグ・アンド・ドロップします。
-
socketWrite拡張関数をダブルクリックします。「関数の編集 - socketWrite」ダイアログが表示されます。
-
valueToWrite、nxsdStyleおよびnxsdStyleAttributesフィールドに関数パラメータを入力します。
ノート:
socketWrite
関数は、NXSDフレームワークで公開されているStyleReader
を使用してソケットの出力ストリームに書き込みます。 -
「OK」をクリックします。「reply.xsl」(XSLマッパー・ツール)ページが表示されます。
-
中央ペインにある
sockWrite
関数を、右ペインにあるターゲットinput
ノードにリンクします。XSLマッピングを含むreply.xsl (XSLマッパー・ツール)が表示されます。
-
-
「ファイル」、「すべて保存」を順番にクリックします。インバウンドOracleソケット・アダプタのrequest.xslおよびreply.xslファイルが作成されます。
6.4.3.2 アウトバウンド同期リクエスト/リプライに使用するXSLの設計
この項では、XSLマッパー・ツールを使用してアウトバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。
この使用例を実行するには、まず次のファイルを作成する必要があります:
-
HelloWorld.xsd
HelloWorld.xsd
の内容
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/HelloWorld"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="HelloWorldProcessRequest">
<complexType>
<sequence>
<element name="input" type="string"/>
</sequence>
</complexType>
</element>
<element name="HelloWorldProcessResponse">
<complexType>
<sequence>
<element name="result" type="string"/>
</sequence>
</complexType>
</element>
</schema>
HelloWorld.xsd
ファイルをHelloWorldComposite
プロジェクトのHelloWorldComposite\xsd
にコピーします。
6.4.3.2.1 SOAコンポジットの設計
SOAコンポジットを設計するには、SOAコンポジットの設計で説明するステップを実行します。
ノート:
「SOAコンポジットの設計」のステップは、Oracle BPEL PMを使用するコンポジットに適用可能です。または、Oracle Mediatorでコンポジットを作成することもできます。
6.4.3.2.2 アウトバウンドOracleソケット・アダプタの作成
アウトバウンドOracleソケット・アダプタ参照を作成するステップは、次のとおりです。
-
「ソケット・アダプタ」を、「コンポーネント・パレット」から「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
「サービス名」フィールドにサービス名として
HelloWorld
,を入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。 -
「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。「操作」ページが表示されます。
-
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択し、「次」をクリックします。「ソケット接続」ページが表示されます。
-
「ソケット接続JNDI名」フィールドに
eis/socket/OutboundSocketAdapter
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。 -
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
図6-15に示すように、「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドに
HelloWorld.xsd
ファイルが移入されます。 -
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。
-
「OK」をクリックします。図6-16に示すように、「メッセージ」ページの「URL」フィールドに
HelloWorld.xsd
ファイルが移入されます。 -
「次へ」をクリックします。「プロトコル」ページが表示されます。
-
「XSLTを使用してハンドシェイクを定義します」を選択します。
-
「Xslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。
-
XSLファイル名としてデフォルト値の
invoke.xsl
を使用し、「OK」をクリックします。 -
「終了」をクリックします。
invoke.xsl
ファイルがXSLマッパー・ツールに表示されます。 -
ターゲット側で「HelloWorldProcessResponse」要素を右クリックします。図6-27に示すように、メニューが表示されます。
-
「変数の追加」をクリックします。「変数の追加」ダイアログが表示されます。
-
「ローカル名」フィールドに
var1
と入力して「OK」をクリックします。var1
変数がXSLマッパー・ツールのターゲット・ペインに追加されます。 -
「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。
-
アウトバウンド同期リクエスト/リプライ操作のリクエスト部分を、データをソケット・サーバーに書き込むように次の手順で定義します。
-
socketWriteWithXlationを、「コンポーネント」ウィンドウの「拡張関数」リストから中央ペインにドラッグ・アンド・ドロップします。
-
var1ノードをsocketWriteWithXlation関数にドラッグします。図6-30に示すように、リンクが作成されます。
-
socketWriteWithXlation拡張関数をダブルクリックします。「関数の編集 - socketWriteWithXlation」ダイアログが表示されます。
-
「NodeList」フィールドにドット(
.
)を入力します。ノート:
socketWriteWithXlation
関数は、出力用に構成されたスキーマを使用してソケットの出力ストリームに書き込みます。「NodeList」フィールドで指定したドット(
.
)は、HelloWorldProcessRequestを最上位ノードに書き込むことを示します。 -
「OK」をクリックします。「警告」ダイアログが表示されます。
-
「はい」をクリックします。「invoke.xsl」ページが表示されます。同期リクエスト/リプライ操作のリクエスト部分が定義されています。
-
-
アウトバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。
-
図6-32に示すように、socketReadWithXlationを、「コンポーネント」ウィンドウの「拡張関数」リストから中央ペインにドラッグ・アンド・ドロップします。
-
「コンポーネント」ウィンドウのリストから「一般」を選択し、「XSLTコンストラクト」を選択します。XSLT構成メンバーのリストが表示されます。
-
copy-ofを、「コンポーネント」ウィンドウからターゲット・ペインのHelloWorldProcessResponseにドラッグします。「copy-ofタイプ・ダイアログ」が表示されます。
図6-33 JDeveloper - 「copy-ofタイプ・ダイアログ」が表示されている「invoke.xsl」ページ
「図6-33 JDeveloper - 「copy-ofタイプ・ダイアログ」が表示されている「invoke.xsl」ページ」の説明 -
「OK」をクリックします。図6-34に示すように、copy-of XSLT構成メンバーがターゲット・ペインに追加された状態で「invoke.xsl」(XSLマッパー・ツール)ページが表示されます。
-
copy-of XSLTコンストラクトをsocketReadWithXlation関数にドラッグします。図6-35に示すように、リンクが作成されます。
-
-
「ファイル」をクリックし、「すべて保存」を選択します。アウトバウンド同期リクエスト/リプライのハンドシェイクが定義されます。
6.4.4 Oracleソケット・アダプタの構成プランでのTCPポートの指定
Oracleソケット・アダプタの構成プランでTCPポートを指定するには、次のステップを実行します(<service-name>はサービス名です)。
デプロイすると、Oracleソケット・アダプタは構成プランで指定されたポート2222でリスニングします。
構成プランなしでコンポジットをデプロイする場合、または構成プランがPortプロパティをオーバーライドしない場合、Oracle Socketアダプタはcomposite.xmlファイルのデフォルトのPortプロパティで指定されたソケット(この例ではポート1111)でリスニングします。
6.4.5 複数のリクエストを受け入れるためのOracle Socket Adapterの有効化
クライアント・ソケットがソケット接続でメッセージをサーバー・ソケットへ送信すると、ソケット接続は要求を処理した後に閉じられます。ただし、複数のリクエストを受け入れるには、長い時間クライアント・ソケット接続をオープンにしておくことができます。
ノート:
この機能は、パッチとして入手できます。このリリースのパッチをダウンロードして、インスタンスを更新します。6.4.6 JavaScriptのサポート
ソケット・アダプタは現在、インバウンドとアウトバウンドの両方のトランザクションに対して複雑なハンドシェイクを定義する方法として、XSLTおよびカスタムJavaプラグインを使用しています。
ただし現在は、これらのトランザクションに対してハンドシェイクを定義する別の方法として、JavaScriptサポートを使用できます。この機能により、インバウンドとアウトバウンドの両方のトランザクションに対してシンプルでリクエスト-リプライのハンドシェイクを定義するためにコール可能な独自のJavaScriptを記述できます。
6.4.6.2 レポート
ソケット・アダプタXSLTおよびJavaScriptの使用例では、クライアント/サーバーのソケットと通信するための通信プロトコルを定義します。NXSDベースの使用例と比較した場合、通常はこの通信では多くのデータ転送は行われません。これらの使用例ではメッセージ・サイズを取得する意味があまりないため、ソケット・アダプタをデプロイし、Fusion Middleware Controlで提供されているスナップショット・レポート・オプションを有効化した場合、メッセージの統計は取得されません。
アダプタ・レポート統計は、NXSDとXSDの変換に対してのみ収集されることに注意してください。これらの統計は、XSLT、JavaScriptおよびカスタム・プロトコルに対してはサポートされていません。
6.4.6.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); }
6.4.7 ソケット・アダプタ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>
6.4.8 ソケット・アダプタに対するSSLのサポート
SSL (Secure Socket Layer)は、インターネット上での通信セキュリティを提供する暗号化プロトコルです。キー交換の非対称型暗号化およびプライバシの対称型暗号化を提供し、トランスポート・レイヤーでネットワーク接続のセグメントを暗号化します。
Oracle Platform Security Service (OPSS)キーストア・サービスでは、SSL、メッセージ・セキュリティ、暗号化および関連タスク用のキーおよび証明書を管理できます。キーストア・サービスは、キー、証明書およびその他のアーティファクトを含むキーストアを作成および管理するために使用します。
KSSを使用するときにTrustStoreName
およびTrustStoreStripeName
を指定しない場合は、ドメイン・レベル・トラスト・ストア(システム/トラスト)が使用されます。
6.4.8.1 ソケット・アダプタでのSSLのサポート
セキュア・ソケット接続を介してデータを送受信する場合は、ソケット・アダプタでSSLをサポートする必要があります。これにより、ベースとなるネットワーク・トランスポート・プロトコル上に次のようなセキュリティ保護層が追加されます。
-
整合性の保護
-
認証
-
機密性(プライバシの保護)
SSLは非NIOのシナリオでのみサポートされます。
SSLは、NXSD変換モードを使用したリクエスト-リプライ・シナリオではサポートされていません。トランスレータ(NXSDまたは不透明ペイロード用)は、ネイティブ・フォーマットからXML SSLに変換する前に、ストリームの終了を探します。ソケット・アダプタAPIではストリームの終了がサポートされないため、NXSD変換を使用したソケット・アダプタはリクエスト-リプライの使用例ではサポートされません。
表6-2に、ソケット・アダプタSSLコネクション・ファクトリのプロパティを示します。これには、KSS (Oracle PSS)モードでSSLを構成するときのSSLコネクション・ファクトリのプロパティのリストも含まれます。
表6-2 KSSモードで構成するときのSSLコネクション・ファクトリのプロパティ
値 | 説明 |
---|---|
|
コネクション・ファクトリがSSLであるかどうかを指定します。 |
|
キーストアのパスワード。 |
|
トラスト・ストアのパスワード。 |
|
SSLプロトコルのバージョン(SSLv3)。 |
|
キーストアのプロバイダ |
|
キーストアのタイプ(=KSS)。 |
|
キー・マネージャ・ファクトリのアルゴリズム。 |
|
トラスト・ストアのプロバイダ |
TrustStoreType |
トラスト・ストアのタイプ(=KSS)。 |
TrustStoreAlgorithm |
キー・マネージャ・ファクトリのアルゴリズム。 |
|
クライアント認証が必須かどうかを指定します(インバウンド)。 |
|
キーストアが作成されるストライプの名前。 |
|
特定のストライプの下のキーストアの名前。 |
|
特定のストライプの下のトラスト・ストアの名前。 |
|
トラスト・ストアが作成されるストライプの名前。 |
6.5 Oracleソケット・アダプタの使用例
この項では、次に示すOracleソケット・アダプタの使用例を説明します。
6.5.1 Oracleソケット・アダプタHello World
これは単純なHelloWorldの使用例であり、Oracleソケット・アダプタを使用した通信の同期インバウンド・リクエスト/レスポンス・モードと同期アウトバウンド・リクエスト/レスポンス・モードを示しています。HelloWorldビジネス・プロセスはOracleソケット・アダプタのインバウンド・サービスから入力文字列を取得し、メッセージをBPELプロセスにパブリッシュします。
BPELプロセスはOracleソケット・アダプタのアウトバウンド・サービス(入力文字列に接頭辞?Hello?
を追加して戻す単純なHelloWorldサーバー)を起動し、同期リプライを使用して受信した文字列を戻します。
この使用例には、次の項目が含まれます。
6.5.1.1 前提条件
この使用例を実行するには、まず次のファイルを作成する必要があります:
-
HelloWorld.xsd
-
request.xsl
-
reply.xsl
-
invoke.xsl
HelloWorld.xsd
の内容
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/HelloWorld"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="HelloWorldProcessRequest">
<complexType>
<sequence>
<element name="input" type="string"/>
</sequence>
</complexType>
</element>
<element name="HelloWorldProcessResponse">
<complexType>
<sequence>
<element name="result" type="string"/>
</sequence>
</complexType>
</element>
</schema>
request.xsl
の内容
<?xml version="1.0" encoding="windows-1252" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns="http://xmlns.oracle.com/HelloWorld">
<!-- Root template -->
<xsl:template match="//input">
<!-- Input coming from the browser would look like
GET /input=sagar; HTTP/1.1.
dummy variable to read the input= text -->
<xsl:variable name="variable1"
select="socket:socketRead('terminated', 'terminatedBy==')"/>
<!-- Read the input string terminated by ;and build the input xml -->
<HelloWorldProcessRequest>
<input>
<xsl:value-of select="socket:socketRead('terminated', 'terminatedBy=;')"/>
</input>
</HelloWorldProcessRequest>
</xsl:template>
</xsl:stylesheet>
reply.xsl
の内容
<?xml version="1.0" encoding="windows-1252" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns="http://xmlns.oracle.com/HelloWorld"
xmlns:a="http://xmlns.oracle.com/HelloWorld">
<xsl:template match="a:HelloWorldProcessResponse">
<!-- Get the result string value into a temp variable. -->
<xsl:variable name="temp">
<xsl:value-of select="a:result"/>
</xsl:variable>
<!-- Write back the result to the socket in an HTML form -->
<xsl:variable name="var0"
select="socket:socketWrite('<html>', '','')"/>
<xsl:variable name="var1"
select="socket:socketWrite('<body>', '','')"/>
<xsl:variable name="var2"
select="socket:socketWrite('<h1>', '','')"/>
<xsl:variable name="var3" select="socket:socketWrite($temp, '','')"/>
<xsl:variable name="var4"
select="socket:socketWrite('</h1>', '','')"/>
<xsl:variable name="var5"
select="socket:socketWrite('</body>', '','')"/>
<xsl:variable name="var6"
select="socket:socketWrite('</html>', '','')"/>
<xsl:variable name="var7" select="socket:socketEndOutput()"/>
</xsl:template>
</xsl:stylesheet>
invoke.xsl
の内容
<?xml version="1.0" encoding="windows-1252" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns="http://xmlns.oracle.com/HelloWorld"
xmlns:a="http://xmlns.oracle.com/HelloWorld">
<!-- Root template -->
<!-- get the input value into a temp variable -->
<xsl:template match="a:HelloWorldProcessRequest">
<xsl:variable name="temp">
<xsl:value-of select="a:input"/>
</xsl:variable>
<!-- write the input string over the socket stream -->
<xsl:variable name="var1"
select="socket:socketWrite($temp, 'terminated', 'terminatedBy=\n')"/>
<xsl:variable name="var2"
select="socket:socketWrite('quit', 'terminated', 'terminatedBy=\n')"/>
<!-- Read the output from the server on the socket stream and build the output -->
<HelloWorldProcessResponse>
<result>
<xsl:value-of select="socket:socketRead('terminated', 'terminatedBy=;')"/>
</result>
</HelloWorldProcessResponse>
</xsl:template>
</xsl:stylesheet>
6.5.1.2 SOAコンポジットの設計
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。
6.5.1.5 サービスとアクティビティのワイヤリング
作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。
6.5.1.6 JDeveloperを使用したデプロイ
前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。
- アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
- アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
6.5.2 フライト情報表示システム
フライト情報表示システムの使用例では、Oracleソケット・アダプタを使用してハンドシェイクを定義する際の各種モードについて説明します。フライト情報表示サーバー(FIDS)は、特定のソース(JFKまたはSFO)からのフライトに関してフライト・ステータス情報をリクエストするFIDSクライアントにより起動されます。起動したFIDSは、3つのエアライン(Airline1、Airline 2およびAirline 3)に関するフライト・データ・リクエストを起動します。次に、受信した情報を収集し、HTTPプロトコルを使用してFIDSクライアントにリプライします。
この項には次のトピックが含まれます:
6.5.2.1 前提条件
この使用例を実行するには、まず次のファイルを作成する必要があります:
-
Airline1.xsd
-
Airline2.xsd
-
Airline3.xsd
-
FIDS.xsd
-
request.xsl
-
reply.xsl
-
invoke.xsl
Airline1.xsd
の内容
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://xmlns.oracle.com/Airline1"
targetNamespace="http://xmlns.oracle.com/Airline1"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:version="NXSD"
nxsd:stream="chars"
nxsd:encoding="ASCII"
>
<xsd:element name="Flight-Details">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Flight" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Number" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy=""" />
<xsd:element name="Schedule" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy=""" />
<xsd:element name="Destination" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy=";" nxsd:quotedBy=""" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Source" type="xsd:string" nxsd:style="fixedLength" nxsd:length="3"/>
</xsd:schema>
<!--USE-HEADER:false:-->
Airline2.xsd
の内容
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://xmlns.oracle.com/Airline2"
targetNamespace="http://xmlns.oracle.com/Airline2"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:version="NXSD"
nxsd:stream="chars"
nxsd:encoding="ASCII"
>
<xsd:element name="flight-details">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="flight" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="flight-nr" type="xsd:string" nxsd:style="fixedLength" nxsd:length="15"/>
<xsd:element name="time" type="xsd:string" nxsd:style="fixedLength" nxsd:length="15"/>
<xsd:element name="dest" type="xsd:string" nxsd:style="fixedLength" nxsd:length="3"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Source" type="xsd:string" nxsd:style="fixedLength" nxsd:length="3"/>
</xsd:schema>
<!--USE-HEADER:false:-->
Airline3.xsd
の内容
<?xml version="1.0" encoding="windows-1252" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://xmlns.oracle.com/Airline3"
targetNamespace="http://xmlns.oracle.com/Airline3"
elementFormDefault="qualified">
<xsd:element name="src" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
A sample element
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="airline">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="flight">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="schedule" type="xsd:string"/>
<xsd:element name="destination" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
FIDS.xsd
の内容
<?xml version="1.0" encoding="windows-1252" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://xmlns.oracle.com/FIDS"
targetNamespace="http://xmlns.oracle.com/FIDS"
elementFormDefault="qualified">
<xsd:element name="FIDSProcessRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="AirlineName" type="xsd:string"
maxOccurs="unbounded"/>
<xsd:element name="Source" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="FIDSProcessReply">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="AirlineName" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FlightDetails" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Number" type="xsd:string"/>
<xsd:element name="Schedule" type="xsd:string"/>
<xsd:element name="Destination" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
request.xsl
の内容
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns="http://xmlns.oracle.com/FIDS">
<xsl:template match="//input">
<!-- dummy variable to read the airlines= text -->
<xsl:variable name="variable1"
select="socket:socketRead('terminated', 'terminatedBy=?')"/>
<FIDSProcessRequest>
<AirlineName>
<xsl:value-of select="socket:socketRead('terminated', 'terminatedBy=,')"/>
</AirlineName>
<AirlineName>
<xsl:value-of select="socket:socketRead('terminated', 'terminatedBy=,')"/>
</AirlineName>
<AirlineName>
<xsl:value-of select="socket:socketRead('terminated', 'terminatedBy=;')"/>
</AirlineName>
<!-- dummy variable to read the src= text -->
<xsl:variable name="variable2"
select="socket:socketRead('terminated', 'terminatedBy==')"/>
<Source>
<xsl:value-of select="socket:socketRead('fixedLength', 'length=3')"/>
</Source>
</FIDSProcessRequest>
</xsl:template>
</xsl:stylesheet>
reply.xsl
の内容
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns:fids="http://xmlns.oracle.com/FIDS">
<xsl:template match="//fids:FIDSProcessReply">
<xsl:variable name="var0" select="socket:socketWrite('<html>', '','')"/>
<xsl:variable name="var1" select="socket:socketWrite('<body>', '','')"/>
<xsl:variable name="var2"
select="socket:socketWrite('<table width=&quot;50%&quot;>', '','')"/>
<xsl:variable name="var3"
select="socket:socketWrite('<tr bgcolor=&quot;#ddc5a6&quot;>', '','')"/>
<xsl:variable name="var4" select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf1"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="varb1" select="socket:socketWrite('<b>', '','')"/>
<xsl:variable name="var5" select="socket:socketWrite('Flight Nr.', '','')"/>
<xsl:variable name="varb2" select="socket:socketWrite('</b>', '','')"/>
<xsl:variable name="varf2"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var6" select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var7" select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf3"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="varb3" select="socket:socketWrite('<b>', '','')"/>
<xsl:variable name="var8" select="socket:socketWrite('Schedule', '','')"/>
<xsl:variable name="varb4" select="socket:socketWrite('</b>', '','')"/>
<xsl:variable name="varf4"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var9" select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var22" select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf23"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="varb23" select="socket:socketWrite('<b>', '','')"/>
<xsl:variable name="var28"
select="socket:socketWrite('Destination', '','')"/>
<xsl:variable name="varb24" select="socket:socketWrite('</b>', '','')"/>
<xsl:variable name="varf24"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var29" select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var10" select="socket:socketWrite('</tr>', '','')"/>
<xsl:for-each select="fids:AirlineName">
<xsl:for-each select="fids:FlightDetails">
<xsl:variable name="var11"
select="socket:socketWrite('<tr>', '','')"/>
<xsl:variable name="var12"
select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf5"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="var13"
select="socket:socketWrite(fids:Number, '','')"/>
<xsl:variable name="varf6"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var14"
select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var15"
select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf7"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="var16"
select="socket:socketWrite(fids:Schedule, '','')"/>
<xsl:variable name="varf8"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var17"
select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var30"
select="socket:socketWrite('<td>', '','')"/>
<xsl:variable name="varf37"
select="socket:socketWrite('<font face=&quot;arial&quot;>', '','')"/>
<xsl:variable name="var136"
select="socket:socketWrite(fids:Destination, '','')"/>
<xsl:variable name="varf38"
select="socket:socketWrite('</font>', '','')"/>
<xsl:variable name="var137"
select="socket:socketWrite('</td>', '','')"/>
<xsl:variable name="var18"
select="socket:socketWrite('</tr>', '','')"/>
</xsl:for-each>
</xsl:for-each>
<xsl:variable name="var19"
select="socket:socketWrite('</table>', '','')"/>
<xsl:variable name="var20"
select="socket:socketWrite('</body>', '','')"/>
<xsl:variable name="var21"
select="socket:socketWrite('</html>', '','')"/>
<xsl:variable name="var101" select="socket:socketEndOutput()"/>
</xsl:template>
</xsl:stylesheet>
invoke.xsl
の内容
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ora="http://www.oracle.com/XSL/Transform/java/"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns="http://xmlns.oracle.com/Airline1"
xmlns:request="http://xmlns.oracle.com/Airline1">
<xsl:template match="//request:Source">
<xsl:variable name="var1"
select="socket:socketWrite(' userb', '','')"/>
<xsl:variable name="var2"
select="socket:socketWrite(' password', '', '')"/>
<xsl:variable name="AirlineReply"
select="socket:socketRead('fixedLength', 'length=3')"/>
<!-- Check if authentication has happened Airline Reply Code = 100 -->
<xsl:if test="number($AirlineReply)=100">
<xsl:variable name="var3"
select="socket:socketWrite(.,'','')"/>
<xsl:copy-of select="socket:socketReadWithXlation()"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
6.5.2.2 SOAコンポジットの設計
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。
6.5.2.3 インバウンドOracleソケット・アダプタ・サービスの作成
次のステップを実行し、FIDSAppアプリケーションの公開に使用するインバウンドOracleソケット・アダプタ・サービスを作成します。
6.5.2.4 アウトバウンドOracleソケット・アダプタ・サービスの作成
次のステップに従って、Airline1サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
-
「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
「サービス名」フィールドに
Airline1
と入力します。 -
「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
-
「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
-
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。
-
「次へ」をクリックします。「ソケット接続」ページが表示されます。
-
図6-74に示すように、「ソケット接続JNDI名」フィールドに
eis/socket/OutboundSocketAdapter
と入力し、「ホストおよびポートの指定」を選択します。 -
「ホスト名」フィールドにAirline1ソケット・サーバー・プログラムを実行する必要のあるシステムの名前を入力し、「ポート番号」フィールドに
9001
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。 -
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「Airline1.xsd」および「Source」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline1.xsdファイルが移入されます。
-
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「Airline1.xsd」および「Flight-Details」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページのURLフィールドに
Airline1.xsd
ファイルが移入されます。 -
「次へ」をクリックします。「プロトコル」ページが表示されます。
-
「XSLTを使用してハンドシェイクを定義します」を選択します。
-
「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
-
ファイル名として「invoke.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。
-
「終了」をクリックします。composite.xmlページが表示されます。
次のステップに従って、Airline2サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
-
「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
「次へ」をクリックします。「サービス名」ページが表示されます。
-
「サービス名」フィールドに
Airline2
と入力します。 -
「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
-
「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
-
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。
-
「次へ」をクリックします。「ソケット接続」ページが表示されます。
-
「ソケット接続JNDI名」フィールドに
eis/socket/OutboundSocketAdapter
と入力して「ホストおよびポートの指定」を選択します。 -
「ホスト名」フィールドにAirline2ソケット・サーバー・プログラムを実行するシステムの名前を入力し、「ポート番号」フィールドに
9002
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。 -
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「Airline2.xsd」および「Source」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドに
Airline2.xsd
ファイルが移入されます。 -
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
「プロジェクトのスキーマ・ファイル」、「Airline2.xsd」および「flight-details」を順番にクリックします。
-
「OK」をクリックします。「メッセージ」ページの「URL」フィールドに
Airline2.xsd
ファイルが移入されます。 -
「次へ」をクリックします。「プロトコル」ページが表示されます。
-
「ハンドシェイクなし」を選択します。
-
「終了」をクリックします。composite.xmlページが表示されます。
次のステップに従って、Airline3サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
6.5.2.5 サービスとアクティビティのワイヤリング
作成したコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。
6.5.2.5.4 Airline1サーバーのフローの設計
-
図6-88に示すように、「コンポーネント」ウィンドウからSequence_1にswitchアクティビティをドラッグ・アンド・ドロップします。
-
switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。
-
図6-89に示すように、「
<case>
」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。 -
ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。
-
図6-90に示すように、式として
boolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline1')
と入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。
ノート:
この式により、Airline1の情報がリクエストされた場合にのみ、このフローが確実に実行されます。
-
「<case>」セクションにinvokeアクティビティを追加します。
-
invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。
-
invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
-
「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
-
「Airline1」を選択して「OK」をクリックします。
-
「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
-
デフォルトの変数名を選択して「OK」をクリックします。「変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。
-
「OK」をクリックします。図6-91に示すように、JDeveloperの「BPEL_FIDS.bpel」ページが表示されます。
-
-
「<case>」セクションにassignアクティビティを追加します。
-
<case>セクションで、Invoke_1アクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。
-
Assign_1アクティビティをダブルクリックします。Assignダイアログが表示されます。
-
「コピー操作」タブをクリックします。Assignダイアログが表示されます。
-
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
-
図6-92に示すように、Receive_1アクティビティの入力変数のソースとInvoke_1アクティビティの入力変数のソースの間にコピー操作を作成します。
-
ダイアログで「OK」をクリックします。「コピー操作の作成」ダイアログが表示されます。
-
「OK」をクリックします。
図6-93に示すように、「BPEL_FIDS.bpel」ページが表示されます。
-
-
「<case>」セクションにtransformアクティビティを追加します。
-
transformアクティビティを「<case>」セクションのInvoke_1アクティビティの後にドラッグ・アンド・ドロップします。
-
transformアクティビティをダブルクリックします。
-
「トランスフォーメーション」タブをクリックします。
-
「作成... (Alt + N)」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
-
「ソース変数」リストから「Invoke_1_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。
-
「ターゲット変数」リストから「Reply_1_InboundRequestReply_OutputVariable」を選択します。
-
「OK」をクリックします。XSLマッパー・ツールが表示されます。
-
左ペインのソースから、「
tns:Flight
」ノードを右ペインにあるターゲットの「FlightDetails
」ノードにリンクします。「自動マップ・プリファレンス」ダイアログが表示されます。 -
「OK」をクリックします。図6-94に示すように、「Transformation_1.xsl」(XSLマッパー・ツール)が表示されます。
-
-
「ファイル」、「すべて保存」を順番にクリックします。図6-95に示すように、Airline1サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
6.5.2.5.5 Airline2サーバーのフローの設計
-
空のsequenceアクティビティをダブルクリックし、「名前」フィールドに
Sequence_2
と入力します。 -
「コンポーネント」ウィンドウからSequence_2にswitchアクティビティをドラッグ・アンド・ドロップします。
-
switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。
-
「
<case>
」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。 -
ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。
-
式として
boolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline2')
と入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。ノート:
この式により、Airline2の情報がリクエストされた場合にのみ、このフローが確実に実行されます。
-
「<case>」セクションにinvokeアクティビティを追加します。
-
invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。
-
Invoke_2アクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
-
「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
-
「Airline2」を選択して「OK」をクリックします。
-
「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
-
デフォルトの変数名を選択して「OK」をクリックします。「入力変数」および「出力変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。
-
「OK」をクリックします。invokeアクティビティがJDeveloperの「BPEL_FIDS.bpel」ページのSequence_2の下に追加されます。
-
-
「<case>」セクションにassignアクティビティを追加します。
-
<case>セクションで、invokeアクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。
-
Assign_2アクティビティをダブルクリックします。Assignダイアログが表示されます。
-
「コピー操作」タブをクリックします。Assignダイアログが表示されます。
-
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
-
図6-96に示すように、Receive_1アクティビティの入力変数のソースとInvoke_2アクティビティの入力変数のソースの間にコピー操作を作成します。
-
「コピー操作の作成」ダイアログで「OK」をクリックします。
-
「OK」をクリックします。
-
-
一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。
ノート:
一時変数は、Airline2サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。
-
(x)で表された「変数」アイコンをクリックします。図6-97に示すように、「変数」ダイアログが表示されます。
-
「作成」アイコンをクリックします。図6-98に示すように、「変数の作成」ダイアログが表示されます。
-
変数タイプとして「メッセージ・タイプ」を選択します。
-
「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
図6-99に示すように、「メッセージ・タイプ」、「パートナ・リンク」、「FIDS」、「FIDS.wsdl」、「メッセージ・タイプ」および「FIDSProcessReply_msg_reply」を順番にクリックします。
-
「OK」をクリックします。「変数の作成」ダイアログの「メッセージ・タイプ」フィールドにFIDSProcessReply_msg_replyパートナ・リンクが移入されます。
-
「OK」をクリックします。「変数」ダイアログの「変数」リストに「メッセージ・タイプ」タイプの変数Variable_1が追加されます。
-
「OK」をクリックして「BPEL_FIDS.bpel」ページに戻ります。
-
transformアクティビティを「<case>」セクションのInvoke_2アクティビティの後にドラッグ・アンド・ドロップします。
-
Transform_2アクティビティをダブルクリックします。
-
「トランスフォーメーション」タブをクリックします。
-
「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
-
「ソース変数」リストから「Invoke_2_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。
-
「ターゲット変数」リストで「Variable_1」を選択します。
-
「OK」をクリックします。XSLマッパー・ツールが表示されます。
-
左ペインのソースから、「
tns:Flight
」ノードを右ペインにあるターゲットの「FlightDetails
」ノードにリンクします。図6-100に示すように、「自動マップ・プリファレンス」ダイアログが表示されます。図6-100 「自動マップ・プリファレンス」ダイアログが表示されている「Transformation_2.xsl」ページ
「図6-100 「自動マップ・プリファレンス」ダイアログが表示されている「Transformation_2.xsl」ページ」の説明 -
「OK」をクリックします。XSLマッピングを含む
Transformation_2.xsl
(XSLマッパー・ツール)ファイルが表示されます。
-
-
「ファイル」、「すべて保存」を順番にクリックします。
図6-101に示すように、Airline2サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
6.5.2.5.6 Airline3サーバーのフローの設計
-
Flow_1アクティビティを右クリックします。メニューから「シーケンスの追加」をクリックします。
Sequence_3
が追加されます。 -
「コンポーネント」ウィンドウからSequence_3にswitchアクティビティをドラッグ・アンド・ドロップします。
-
switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。
-
「
<case>
」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。 -
ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。
-
式として
boolean(bpws:getVariableData('Receive_1_InboundRequestReply_InputVariable','FIDSProcessRequest','/ns5:FIDSProcessRequest/ns5:AirlineName')='Airline3')
と入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。ノート:
この式により、Airline3の情報がリクエストされた場合にのみ、このフローが確実に実行されます。
-
「<case>」セクションにinvokeアクティビティを追加します。
-
invokeアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。
-
Invoke_3アクティビティをダブルクリックします。Invokeダイアログが表示されます。
-
「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
-
「Airline3」を選択して「OK」をクリックします。
-
「Invoke」ダイアログで、「入力」および「出力」変数フィールドの右にある「入力変数の自動作成」および「出力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
-
デフォルトの変数名を選択して「OK」をクリックします。「入力変数」および「出力変数」フィールドにデフォルトの変数名が移入されます。「Invoke」ダイアログが表示されます。
-
「OK」をクリックします。invokeアクティビティがJDeveloperの「BPEL_FIDS.bpel」ページのSequence_3の下に追加されます。
-
-
「<case>」セクションにassignアクティビティを追加します。
-
<case>セクションで、invokeアクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。
-
Assign_3アクティビティをダブルクリックします。Assignダイアログが表示されます。
-
「コピー操作」タブをクリックします。Assignダイアログが表示されます。
-
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
-
図6-102に示すように、Receive_1アクティビティの入力変数のソースとInvoke_3アクティビティの入力変数のソースの間にコピー操作を作成します。
-
「コピー操作の作成」ダイアログで「OK」をクリックします。
-
「OK」をクリックします。
-
-
一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。
ノート:
一時変数は、Airline3サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。
-
(x)で表された「変数」アイコンをクリックします。図6-103に示すように、「変数」ダイアログが表示されます。
-
「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
-
変数タイプとして「メッセージ・タイプ」を選択します。
-
「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。
-
図6-99に示すように、「メッセージ・タイプ」、「パートナ・リンク」、「FIDS」、「FIDS.wsdl」、「メッセージ・タイプ」および「FIDSProcessReply_msg_reply」を順番にクリックします。
-
「OK」をクリックします。「変数の作成」ダイアログの「メッセージ・タイプ」フィールドにFIDSProcessReply_msg_replyパートナ・リンクが移入されます。
-
「OK」をクリックします。「変数」ダイアログの「変数」リストに「メッセージ・タイプ」タイプの変数Variable_2が追加されます。
-
「OK」をクリックして「BPEL_FIDS.bpel」ページに戻ります。
-
transformアクティビティを「<case>」セクションのInvoke_3アクティビティの後にドラッグ・アンド・ドロップします。
-
Transform_3アクティビティをダブルクリックします。
-
「トランスフォーメーション」タブをクリックします。
-
「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
-
「ソース変数」リストから「Invoke_3_OutboundRequestReply_OutputVariable」を選択し、「OK」をクリックします。
-
「ターゲット変数」リストで「Variable_2」を選択します。
-
「OK」をクリックします。XSLマッパー・ツールが表示されます。
-
左ペインのソースから、「
tns:Flight
」ノードを右ペインにあるターゲットの「FlightDetails
」ノードにリンクします。「自動マップ・プリファレンス」ダイアログが表示されます。 -
「OK」をクリックします。図6-104に示すように、XSLマッピングを含むTransformation_3.xsl (XSLマッパー・ツール)ファイルが表示されます。
-
-
「ファイル」、「すべて保存」を順番にクリックします。図6-105に示すように、Airline3サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
6.5.2.6 JDeveloperを使用したデプロイ
前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。
- アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
- アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
ServerおよびClient Javaプログラムを実行して、アプリケーションをテストする必要があります。詳細は、関連するREADMEファイルを参照してください。
6.5.3 ソケット・アダプタのクラスタ・サポート
クラスタ化環境とは、単一のIPアドレスを持つ単一のマシンで複数の管理対象サーバーが実行される環境のことです。インバウンドOracleソケット・アダプタをクラスタ化環境にデプロイしようとすると、管理対象サーバーの1つで、サーバーのポートがすでに使用されているというエラー・メッセージが表示されます。
ただし、ソケット・アダプタではクラスタ化環境のサポートが提供されています。クラスタ化環境で例外をスローしないようにソケット・アダプタを構成できます。
垂直クラスタ環境でのみ、単一の物理マシン上で複数の管理対象サーバーを実行できることに注意してください。水平クラスタ環境では、これは該当しません。
垂直クラスタ・トポロジには、カンマ区切りのポートが必要です。
6.5.3.1 ソケット・アダプタをクラスタ化環境で使用するための構成
ソケット・アダプタをクラスタ化環境で使用するように構成するには、該当するコネクション・ファクトリ内で、ソケット・アダプタが使用するポートをカンマ区切りリストで指定する必要があります。
ポートのカンマ区切りリストを構成すると、アダプタはリスト内の最初のポートでサーバー・ソケットを開始しようとします。
ソケット・アダプタは、サーバー・ソケットの開始に失敗すると、リスト内の次のポートを試行します。ソケット・アダプタは、いずれかのポートでサーバー・ソケットを開始するまで、引き続きソケットの開始を試行します。
指定したいずれのポートでもサーバー・ソケットを開始できない場合、ソケット・アダプタはoracle.tip.adapter.socket.SocketServerCreationException
をスローします。
6.5.3.1.1 Coherenceによるパフォーマンスの最適化
ソケット・アダプタは、Coherenceレイヤーを使用してポート・リストからポートを取得します。管理対象サーバー上のインバウンド・ソケット・アダプタの各インスタンスは、リストからポートをフェッチし、フェッチしたポートをソケット・アダプタの他のインスタンスから見えないようにします。
インバウンド・ソケット・アダプタは、フェッチしたポートを正常に開いた場合、フェッチしたポートをリストから削除します。
それ以外の場合、フェッチしたポートはインバウンド・ソケット・アダプタの他のインスタンスから可視になります。管理対象サーバー上のインバウンド・ソケット・アダプタの他のインスタンスは、リストの同じポートを開こうとしません。
6.5.3.1.2 クラスタ化環境でソケット・アダプタのサポートを有効化するための、JNDIコネクション・ファクトリの「ポート」プロパティの更新
クラスタ化環境でソケット・アダプタのサポートを有効化するには、インバウンド・ソケット・アダプタに対してポートのリストを指定する必要があります。リストを指定するには、図6-110に示すように、WebLogicコンソールを開き、ポートのカンマ区切り値でJNDIコネクション・ファクトリの「ポート」プロパティを更新する必要があります。