Oracleソケット・アダプタはJCA 1.5準拠のアダプタであり、TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化に使用されます。Oracleソケット・アダプタを使用すると、クライアントまたはサーバー・ソケットの作成や、接続の確立が可能です。テキストまたはバイナリのデータを転送できます。
Oracleソケット・アダプタは、JCA 1.5アーキテクチャに基づいています。JCAでは、異機種間のエンタープライズ情報システム(EIS)の統合に標準アーキテクチャを提供します。Oracleソケット・アダプタのJCAバインディング・コンポーネントでは、基礎となるJCA相互作用がOracle BPEL PM統合のサービス(JCAバインディングを使用したWSDL
)として公開されています。図5-1に、Oracleソケット・アダプタのアーキテクチャを示します。Oracle JCAアダプタのアーキテクチャの詳細は、「アーキテクチャ」を参照してください。
Oracleソケット・アダプタは、自動的にメディエータと統合されます。JDeveloperデザイナでOracle Sockeアダプタ・サービスを作成すると、アダプタ構成ウィザードが起動します。このウィザードでOracleソケット・アダプタを構成できます。構成が完了すると、Oracle JDeveloper (JDeveloper)の「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。
アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。
Oracle JCAアダプタとメディエータの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。
Oracleソケット・アダプタは、自動的にOracle BPEL PMと統合されます。JDeveloper BPELデザイナの「コンポーネント」ウィンドウから「ソケット・アダプタ」をドラッグ・アンド・ドロップすると、図5-2に示すように、アダプタ構成ウィザードが起動して「ようこそ」ページが表示されます。
このウィザードでOracleソケット・アダプタを構成できます。アダプタ構成ウィザードでは、図5-3に示すように、サービス名の入力を求められます。
構成が完了すると、JDeveloperの「アプリケーション・ナビゲータ」セクションに同じ名前のWSDLファイルが作成されます。このWSDLファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。
アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。
Oracle JCAアダプタとOracle BPEL PMの統合の詳細は、「アダプタとOracle Fusion Middlewareの統合」を参照してください。
コンポジットは、設計されて単一アプリケーションにデプロイされるサービス、サービス・コンポーネント(Oracle BPEL PMおよびメディエータ)、ワイヤおよび参照のアセンブリです。コンポジットにより、メッセージに記述された情報が処理されます。コンポジットの詳細は、composite.xml
ファイルに格納されます。Oracleソケット・アダプタとSOAコンポジットの統合の詳細は、「Oracle SOAコンポジットとアダプタの統合」を参照してください。
Oracleソケット・アダプタを使用すると、TCP/IPソケットを介してデータの読取りおよび書込みをするようにBPELプロセスまたはメディエータ・サービスを構成できます。
Oracleソケット・アダプタには次の特徴があります。
TCP/IPソケットを介した通信用の標準または非標準プロトコルのモデル化が可能
インバウンドとアウトバウンドの両方の通信をサポート
複雑なプロトコル・ハンドシェイクをXSLで宣言的にモデル化可能
プロトコル・ハンドシェイクのモデル化にカスタムJavaコードのプラグインを選択可能
アダプタがトランスレータ・インフラストラクチャ(NXSD)と統合されているため、ソケットを介したネイティブ・データの読取りおよび書込みをサポート
複数のキャラクタ・エンコーディングをサポート
Oracleソケット・アダプタの考え方を概観します。
Oracleソケット・アダプタでは、ソケットを介したインバウンドおよびアウトバウンドの通信(単方向または双方向)をサポートしています。Oracleソケット・アダプタの通信モードは、次の各項で説明します。
インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。Oracleソケット・アダプタでは次に、同じ接続を使用してレスポンスを同期的に返信します。
図5-4に、インバウンド同期リクエスト/レスポンスのシナリオを示します。
アウトバウンド同期リクエスト/レスポンスの場合、リクエストはBPELまたはメディエータから行われます。Oracleソケット・アダプタはサーバー・ソケットに接続し、リクエスト・メッセージをサーバー・ソケットに出力ストリームで送信します。Oracleソケット・アダプタは次に、サーバー・ソケットからのレスポンスを入力ストリームでブロックし、レスポンスをBPELまたはメディエータに返信します。
図5-5に、アウトバウンド同期リクエスト/レスポンスのシナリオを示します。
インバウンド起動の一環として、Oracleソケット・アダプタはサーバー・ソケットを開き、着信接続を待機します。アダプタではサーバー・ソケットへの接続を使用し、リクエスト・メッセージを読み取ります。このメッセージはBPELまたはメディエータにパブリッシュされます。このシナリオでは、リプライは送信されません。
通信プロトコルまたはハンドシェイクは、認証手順、確認、状況に応じたデータの送受信など、異なる個別のステップで構成されます。Oracleソケット・アダプタでは、プロトコル・ハンドシェイクを定義する次の各メカニズムをサポートしています。
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を使用する拡張関数の使用方法を示しています。
入力および出力変数を定義するスキーマに注釈を付け、NXSD構成メンバーを使用して、次のメソッドでソケット・ストリームからの読取りおよび書込みを行います。
socketReadWithXlation():DocumentFragment
このメソッドを、入力用に構成されたスキーマおよびスキーマ要素を使用した、ソケットの入力ストリームからの読取りに使用できます。
socketWriteWithXlation(xml:NodeList)
このメソッドを、出力用に構成されたスキーマを使用した、ソケットの出力ストリームへの書込みに使用できます。
図5-7に示すXSDファイルは、NXSD構成メンバーを使用して、入力および出力変数を定義するスキーマに注釈を付け、拡張関数の使用方法を示しています。
スタイルシートを使用してハンドシェイクを定義するには、図5-8に示すように、「プロトコル」ページで「XSLTを使用してハンドシェイクを定義します」を選択し、参照してXSLファイルを選択する必要があります。
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クラスを指定する必要があります。
Oracleソケット・アダプタは、ソケットのI/Oストリームとの間の変換に関連するハンドシェイクを必要としないプロトコルを使用するように構成できます。
ハンドシェイクを必要としないプロトコルを使用するには、図5-10に示すように、「プロトコル」ページで「ハンドシェイクなし」を選択する必要があります。
「エンコーディング」プロパティはネイティブ・データの格納に使用されるキャラクタ・エンコーディングを表し、「バイト順」プロパティはネイティブ・データのバイト順(BIG_ENDIAN
またはLITTLE_ENDIAN
)です。
キャラクタ・エンコーディングとバイト順は、ネイティブ・フォーマット・ビルダー・ウィザードを使用してスキーマ・ファイル(NXSD)内で指定できます。また、使用するエンコーディングとバイト順をアダプタ構成ウィザードで指定することもできます。エンコーディングとバイト順を指定しない場合、デフォルト値はUS-ASCII
とBIG_ENDIAN
です。
変換を使用する場合にのみ適用可能なエンコーディングとバイト順の値を指定するには、アダプタ構成ウィザードの「プロトコル」ページで次の手順を実行する必要があります。
図5-11に示すように、「プロトコル」ページの「エンコーディング/バイト順」セクションで「エンコーディング/バイト順の指定」オプションを選択します。
次のいずれかのタスクを実行してエンコーディングを設定します。
スキーマ・ファイルで指定されたエンコーディングを使用するには、「エンコーディング」の選択を解除したままにします。
アダプタ構成ウィザードを使用してエンコーディングを指定するには、「エンコーディング」を選択し、「エンコーディング」リストからエンコーディング・タイプを選択します。
注意:
「エンコーディング」を選択した場合、アダプタ構成ウィザードを使用して指定したエンコーディング・タイプがNXSDファイル内で指定されているエンコーディング・タイプよりも優先されます。
次のいずれかのタスクを実行してバイト順を設定します。
スキーマ・ファイルで指定したバイト順を使用するには、「スキーマからバイト順の値を使用します」を選択します。
アダプタ構成ウィザードを使用してバイト順を指定するには、「バイト順」を選択し、「バイト順」リストからバイト順を選択します。
「終了」をクリックします。「終了」をクリックした後で、構成ウィザードに、ソケット・アダプタの構成が完了したことを示すページが表示されます。
Oracleソケット・アダプタでは、次のパフォーマンス・チューニング機能がサポートされています。
詳細は、「Oracle JCAアダプタ・チューニング・ガイド」および「Oracle JCAアダプタのプロパティ」を参照してください。
Oracleソケット・アダプタを構成するには、次のタスクを実行する必要があります。
Oracleソケット・アダプタを構成するには、表5-1にリストされているプロパティの値をweblogic-ra.xml
ファイルに指定する必要があります。これらのプロパティはOracle WebLogic Server管理コンソールから更新できます。詳細は、「アダプタ・コネクション・ファクトリの追加」を参照してください。
表5-1 Oracleソケット・アダプタの構成プロパティ
プロパティ | 説明 |
---|---|
Host |
アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、接続先となるシステム名。インバウンド相互作用の場合は、常に |
Port |
アウトバウンド相互作用の場合は、ソケット・サーバーが実行されていて、アダプタの接続先となるポート番号です。インバウンド相互作用の場合は、着信接続をソケット・アダプタがリスニングするポート番号です。 |
Timeout |
この値がゼロ以外のタイムアウト間隔に設定されている場合、このソケットに関連付けられているInputStreamに対する |
KeepAlive |
アウトバウンド相互作用の場合にのみ適用可能。接続プール機能を使用するには、 |
BacklogQueue |
インバウンド相互作用の場合に適用可能。この値は、着信接続指示(接続リクエスト)の最大キュー長さを示します。キューが一杯のときに接続指示が到着すると、接続は拒否されます。 |
注意:
Oracleリリース11gからリリース12gにアップグレードすると、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
に設定する必要があります。
クライアントまたはサーバー・ソケットと接続をネゴシエートするには、ハンドシェイクが必要な場合があります。
アウトバウンド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>
インバウンド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>
Oracleソケット・アダプタの場合、XSLマッパー・ツールを使用してXSLファイルを設計できます。次の各項では、様々な通信シナリオに使用するXSLの設計手順について説明します。
この項では、XSLマッパー・ツールを使用してインバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。
注意:
この使用例を実行するには、Adapters-101SocketAdapterHelloWorld
サンプルに含まれているartifacts.zip
ファイルの次のファイルが必要です。
artifacts/schemas/HelloWorld.xsd
Oracle SOA Sample CodeサイトでAdapters-101SocketAdapterHelloWorld
サンプルにアクセスできます。
このファイルをHelloWorldComposite
プロジェクトのHelloWorldComposite\xsd
フォルダにコピーします。
SOAコンポジットを設計するには、「SOAコンポジットの設計」で説明する手順を実行します。
注意:
「SOAコンポジットの設計」の手順は、Oracle BPEL PMを使用するコンポジットに適用可能です。または、メディエータでコンポジットを作成することもできます。
インバウンドOracleソケット・アダプタ・サービスを作成する手順は、次のとおりです。
「コンポーネント・パレット」から、「ソケット・アダプタ」を「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
「Next」をクリックします。「サービス名」ページが表示されます。
「サービス名」フィールドにサービス名としてHelloWorld
を入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
図5-16に示すように、「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
「操作タイプ」として「インバウンド同期リクエスト/リプライ」を選択し、「次へ」をクリックします。「ソケット接続」ページが表示されます。
図5-17に示すように、「ソケット接続JNDI名」フィールドにeis/socket/InboundSocketAdapter
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
図5-18に示すように、「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。
「OK」をクリックします。図5-19に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsdファイルが移入されます。
「Next」をクリックします。図5-20に示すように、「プロトコル」ページが表示されます。
「XSLTを使用してハンドシェイクを定義します」を選択します。
「XSLT」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。図5-21に示すように、「入力」ダイアログが表示されます。
図5-21に示すように、XSLファイル名としてデフォルト値のrequest.xslを使用し、「OK」をクリックします。
「ReplyXslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。
XSLファイル名としてデフォルト値のreply.xslを使用し、「OK」をクリックします。
「終了」をクリックします。request.xslおよびreply.xslファイルが作成されます。
図5-22に、「request.xsl」ページを示します。
注意:
「request.xsl
」ページの左側にある「ソース」ペインにはdummy.xsd
ファイルが表示され、これがXSLマッパー・ツールのソースとして使用されます。
インバウンド・リクエスト・シナリオの場合、Oracleソケット・アダプタはソケットが受信するネイティブ・データを読み取ってXMLフォーマットに変換します。つまり、ソース側にXMLファイルはありません。XSLTマッパーは常にソースおよびターゲットXSDファイルを必要とするため、マッパー・ツールにはダミーのXSDファイルが表示されます。
図5-23に、「reply.xsl
」ページを示します。
注意:
「reply.xsl
」ページの右側にあるターゲット・ペインには、dummy.xsd
ファイルが表示されます。このdummy.xsd
ファイルは、XSLマッパー・ツールのターゲットとして使用されます。
インバウンド同期リクエスト/リプライ操作のリクエスト部分を次の手順で定義します。
図5-24に示すように、「request.xsl」ページで、「コンポーネント・パレット」の「Advanced Functions」リストからsocketReadを中央ペインにドラッグ・アンド・ドロップします。
socketRead拡張関数をダブルクリックします。「関数の編集 - socketRead」ダイアログが表示されます。
図5-25に示すように、「nxsdStyle」および「nxsdStyleAttributes」フィールドに関数パラメータを入力します。
注意:
socketRead
関数は、NXSDフレームワークで公開されているStyleReader
を使用してソケットの入力ストリームから読み取ります。
「OK」をクリックします。「request.xsl」(XSLマッパー・ツール)ページが表示されます。
中央ペインにあるsockRead
関数を、右ペインにあるターゲットinput
ノードにリンクします。図5-26に示すように、XSLマッピングを示すrequest.xsl (XSLマッパー・ツール)が表示されます。
インバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。
「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。
「reply.xsl」ページで、「コンポーネント」ウィンドウの「拡張関数」リストからsocketWriteを中央ペインにドラッグ・アンド・ドロップします。
socketWrite拡張関数をダブルクリックします。「関数の編集 - socketWrite」ダイアログが表示されます。
図5-27に示すように、「valueToWrite」、「nxsdStyle」および「nxsdStyleAttributes」フィールドに関数パラメータを入力します。
注意:
socketWrite
関数は、NXSDフレームワークで公開されているStyleReader
を使用してソケットの出力ストリームに書き込みます。
「OK」をクリックします。「reply.xsl」(XSLマッパー・ツール)ページが表示されます。
中央ペインにあるsockWrite
関数を、右ペインにあるターゲットinput
ノードにリンクします。図5-28に示すように、XSLマッピングを示すreply.xsl (XSLマッパー・ツール)が表示されます。
「ファイル」、「すべて保存」を順番にクリックします。インバウンドOracleソケット・アダプタのrequest.xslおよびreply.xslファイルが作成されます。
この項では、XSLマッパー・ツールを使用してアウトバウンド同期リクエスト/リプライのシナリオのXSLを設計する手順について説明します。
注意:
この使用例を実行するには、Adapters-101SocketAdapterHelloWorld
サンプルに含まれているartifacts.zip
ファイルの次のファイルが必要です。
artifacts/schemas/HellowWorld.xsd
Oracle SOA Sample CodeサイトでAdapters-101SocketAdapterHelloWorld
サンプルにアクセスできます。
HelloWorld.xsd
ファイルをHelloWorldComposite
プロジェクトのHelloWorldComposite\xsd
にコピーします。
SOAコンポジットを設計するには、「SOAコンポジットの設計」で説明する手順を実行します。
注意:
「SOAコンポジットの設計」の手順は、Oracle BPEL PMを使用するコンポジットに適用可能です。または、メディエータでコンポジットを作成することもできます。
アウトバウンドOracleソケット・アダプタ参照を作成する手順は、次のとおりです。
「コンポーネント・パレット」から、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
「Next」をクリックします。「サービス名」ページが表示されます。
「サービス名」フィールドにサービス名としてHelloWorld
を入力して「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
図5-16に示すように、「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択し、「次へ」をクリックします。「ソケット接続」ページが表示されます。
「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapter
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
図5-18に示すように、「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessRequest」を順番にクリックします。
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにHelloWorld.xsd
ファイルが移入されます。
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「HelloWorld.xsd」および「HelloWorldProcessResponse」を順番にクリックします。
「OK」をクリックします。図5-19に示すように、「メッセージ」ページの「URL」フィールドにHelloWorld.xsd
ファイルが移入されます。
「Next」をクリックします。「プロトコル」ページが表示されます。
「XSLTを使用してハンドシェイクを定義します」を選択します。
「Xslt」フィールドの端に表示される「新規XSLファイルを作成します」アイコンをクリックします。「入力」ダイアログが表示されます。
XSLファイル名としてデフォルト値のinvoke.xsl
を使用し、「OK」をクリックします。
「終了」をクリックします。図5-29に示すように、XSLマッパー・ツールにinvoke.xslファイルが表示されます。
ターゲット側で「HelloWorldProcessResponse」要素を右クリックします。図5-30に示すように、メニューが表示されます。
「変数の追加」をクリックします。図5-31に示すように、「変数の追加」ダイアログが表示されます。
「ローカル名」フィールドにvar1
と入力して「OK」をクリックします。var1変数がXSLマッパー・ツールのターゲット・ペインに追加されます。
「コンポーネント」ウィンドウのリストから「拡張」を選択し、「拡張関数」を選択します。拡張関数のリストが表示されます。
アウトバウンド同期リクエスト/リプライ操作のリクエスト部分を、データをソケット・サーバーに書き込むように次の手順で定義します。
図5-32に示すように、「コンポーネント」ウィンドウの「拡張関数」リストからsocketWriteWithXlationを中央ペインにドラッグ・アンド・ドロップします。
var1ノードをsocketWriteWithXlation関数にドラッグします。図5-33に示すように、リンクが作成されます。
socketWriteWithXlation拡張関数をダブルクリックします。「関数の編集 - socketWriteWithXlation」ダイアログが表示されます。
図5-34に示すように、「NodeList」フィールドにドット1個(.)を入力します。
注意:
socketWriteWithXlation
関数は、出力用に構成されたスキーマを使用してソケットの出力ストリームに書き込みます。
「NodeList」フィールドで指定したドット(.)は、HelloWorldProcessRequestを最上位ノードに書き込むことを示します。
「OK」をクリックします。「警告」ダイアログが表示されます。
「はい」をクリックします。「invoke.xsl」ページが表示されます。同期リクエスト/リプライ操作のリクエスト部分が定義されています。
アウトバウンド同期リクエスト/リプライ操作のリプライ部分を次の手順で定義します。
図5-35に示すように、「コンポーネント」ウィンドウの「拡張関数」リストからsocketReadWithXlationを中央ペインにドラッグ・アンド・ドロップします。
「コンポーネント」ウィンドウのリストから「一般」を選択し、「XSLTコンストラクト」を選択します。XSLT構成メンバーのリストが表示されます。
copy-ofを、「コンポーネント」ウィンドウからターゲット・ペインのHelloWorldProcessResponseにドラッグします。図5-36に示すように、「copy-ofタイプ・ダイアログ」が表示されます。
図5-36 JDeveloper - 「copy-ofタイプ・ダイアログ」が表示されている「invoke.xsl」ページ
「OK」をクリックします。図5-37に示すように、copy-of XSLT構成メンバーがターゲット・ペインに追加された状態で「invoke.xsl」(XSLマッパー・ツール)ページが表示されます。
copy-of XSLT構成メンバーをsocketReadWithXlation関数にドラッグします。図5-38に示すように、リンクが作成されます。
「ファイル」、「すべて保存」を順番にクリックします。アウトバウンド同期リクエスト/リプライのハンドシェイクが定義されます。
Oracleソケット・アダプタの構成プランでTCPポートを指定するには、次の手順を実行します(<service-name>はサービス名です)。
デプロイすると、Oracleソケット・アダプタは構成プランで指定されたポート2222でリスニングします。
構成プランなしでコンポジットをデプロイする場合、または構成プランがPortプロパティをオーバーライドしない場合、Oracle Socketアダプタはcomposite.xmlファイルのデフォルトのPortプロパティで指定されたソケット(この例ではポート1111)でリスニングします。
ソケット・アダプタは現在、インバウンドとアウトバウンドの両方のトランザクションに対して複雑なハンドシェイクを定義する方法として、XSLTおよびカスタムJavaプラグインを使用しています。
ただし現在は、これらのトランザクションに対してハンドシェイクを定義する別の方法として、JavaScriptサポートを使用できます。この機能により、インバウンドとアウトバウンドの両方のトランザクションに対してシンプルでリクエスト-リプライのハンドシェイクを定義するためにコール可能な独自のJavaScriptを記述できます。
ソケット・アダプタXSLTおよびJavaScriptの使用例では、クライアント/サーバーのソケットと通信するための通信プロトコルを定義します。NXSDベースの使用例と比較した場合、通常はこの通信では多くのデータ転送は行われません。これらの使用例ではメッセージ・サイズを取得する意味があまりないため、ソケット・アダプタをデプロイし、Fusion Middleware Controlで提供されているスナップショット・レポート・オプションを有効化した場合、メッセージの統計は取得されません。
アダプタ・レポート統計は、NXSDとXSDの変換に対してのみ収集されることに注意してください。これらの統計は、XSLT、JavaScriptおよびカスタム・プロトコルに対してはサポートされていません。
次の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); }
現在のソケット・アダプタでは、インバウンド接続に対して、接続ごとにスレッドのアプローチが使用されます。接続ごとにスレッドのアプローチでは、接続ごとに排他的なワーカー・スレッドを使用します。処理ループ内で、ワーカー・スレッドは新規の受信データを待機し、リクエストを処理して、レスポンス・データを返します。この動作により、相互作用が完了するまでスレッドがブロックされます。
ただし、多くの同時ユーザーがインバウンド・ソケット・アダプタを使用しているシナリオでは、オペレーティングシステム/スレッド・プールの制限に達すると、スレッドの待機が発生します。多くのスレッドに独自のメモリー・フットプリントがありますが、このため特定の場合にメモリ不足の例外が発生することがあります。
ソケット・アダプタは(新規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>
SSL (Secure Socket Layer)は、インターネット上での通信セキュリティを提供する暗号化プロトコルです。鍵交換の非対称型暗号化およびプライバシの対称型暗号化を提供し、トランスポート・レイヤーでネットワーク接続のセグメントを暗号化します。
Oracle Platform Security Service (OPSS)キーストア・サービスでは、SSL、メッセージ・セキュリティ、暗号化および関連タスク用のキーおよび証明書を管理できます。キーストア・サービスは、キー、証明書およびその他のアーティファクトを含むキーストアを作成および管理するために使用します。
KSSを使用するときにTrustStoreName
およびTrustStoreStripeName
を指定しない場合は、ドメイン・レベル・トラスト・ストア(システム/トラスト)が使用されます。
セキュア・ソケット接続を介してデータを送受信する場合は、ソケット・アダプタでSSLをサポートする必要があります。これにより、ベースとなるネットワーク・トランスポート・プロトコル上に次のようなセキュリティ保護層が追加されます。
整合性の保護
認証
機密性(プライバシの保護)
SSLは非NIOのシナリオでのみサポートされます。
SSLは、NXSD変換モードを使用したリクエスト-リプライ・シナリオではサポートされていません。トランスレータ(NXSDまたは不透明ペイロード用)は、ネイティブ・フォーマットからXML SSLに変換する前に、ストリームの終了を探します。ソケット・アダプタAPIではストリームの終了がサポートされないため、NXSD変換を使用したソケット・アダプタはリクエスト-リプライの使用例ではサポートされません。
表5-2に、ソケット・アダプタSSLコネクション・ファクトリのプロパティを示します。これには、KSS (Oracle PSS)モードでSSLを構成するときのSSLコネクション・ファクトリのプロパティのリストも含まれます。
表5-2 KSSモードで構成するときのSSLコネクション・ファクトリのプロパティ
値 | 説明 |
---|---|
|
コネクション・ファクトリがSSLであるかどうかを指定します。 |
|
キーストアのパスワード。 |
|
トラスト・ストアのパスワード。 |
|
SSLプロトコルのバージョン(SSLv3)。 |
|
キーストアのプロバイダ |
|
キーストアのタイプ(=KSS)。 |
|
キー・マネージャ・ファクトリのアルゴリズム。 |
|
トラスト・ストアのプロバイダ |
TrustStoreType |
トラスト・ストアのタイプ(=KSS)。 |
TrustStoreAlgorithm |
キー・マネージャ・ファクトリのアルゴリズム。 |
|
クライアント認証が必須かどうかを指定します(インバウンド)。 |
|
キーストアが作成されるストライプの名前。 |
|
特定のストライプの下のキーストアの名前。 |
|
特定のストライプの下のトラスト・ストアの名前。 |
|
トラスト・ストアが作成されるストライプの名前。 |
この項では、次に示すOracleソケット・アダプタの使用例を説明します。
これは単純なHelloWorldの使用例であり、Oracleソケット・アダプタを使用した通信の同期インバウンド・リクエスト/レスポンス・モードと同期アウトバウンド・リクエスト/レスポンス・モードを示しています。HelloWorldビジネス・プロセスはOracleソケット・アダプタのインバウンド・サービスから入力文字列を取得し、メッセージをBPELプロセスにパブリッシュします。
BPELプロセスはOracleソケット・アダプタのアウトバウンド・サービス(入力文字列に接頭辞?Hello?を追加して戻す単純なHelloWorldサーバー)を起動し、同期リプライを使用して受信した文字列を戻します。
この使用例には、次の項目が含まれます。
この使用例を実行するには、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
サンプルにアクセスできます。
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成する手順は、次のとおりです。
作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続する手順は、次のとおりです。
前述の手順で作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次の手順を実行する必要があります。
フライト情報表示システムの使用例では、Oracleソケット・アダプタを使用してハンドシェイクを定義する際の各種モードについて説明します。フライト情報表示サーバー(FIDS)は、特定のソース(JFKまたはSFO)からのフライトに関してフライト・ステータス情報をリクエストするFIDSクライアントにより起動されます。起動したFIDSは、3つのエアライン(Airline1、Airline 2およびAirline 3)に関するフライト・データ・リクエストを起動します。次に、受信した情報を収集し、HTTPプロトコルを使用してFIDSクライアントにリプライします。
この使用例には、次の項目が含まれます。
この使用例を実行するには、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サイトにアクセスします。
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成する手順は、次のとおりです。
次の手順を実行し、FIDSAppアプリケーションの公開に使用するインバウンドOracleソケット・アダプタ・サービスを作成します。
次の手順に従って、Airline1サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
「Next」をクリックします。「サービス名」ページが表示されます。
「サービス名」フィールドにAirline1
と入力します。
「Next」をクリックします。「アダプタ・インタフェース」ページが表示されます。
「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。
「Next」をクリックします。「ソケット接続」ページが表示されます。
図5-82に示すように、「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapter
と入力し、「ホストおよびポートの指定」を選択します。
「ホスト名」フィールドにAirline1ソケット・サーバー・プログラムを実行する必要のあるシステムの名前を入力し、「ポート番号」フィールドに9001
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「Airline1.xsd」および「Source」を順番にクリックします。
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline1.xsdファイルが移入されます。
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「Airline1.xsd」および「Flight-Details」を順番にクリックします。
「OK」をクリックします。図5-83に示すように、「メッセージ」ページの「URL」フィールドにAirline1.xsd
ファイルが移入されます。
「Next」をクリックします。「プロトコル」ページが表示されます。
「XSLTを使用してハンドシェイクを定義します」を選択します。
「Xslt」フィールドの端に表示される「参照してXSLファイルを選択します」をクリックします。「SOAリソース・ブラウザ」ダイアログが表示されます。
図5-84に示すように、「ファイル名」として「invoke.xsl」を選択して「OK」をクリックします。「Xslt」フィールドに移入が行われます。
「終了」をクリックします。「composite.xml」ページが図5-85のように表示されます。
次の手順に従って、Airline2サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
「コンポーネント」ウィンドウから、「ソケット・アダプタ」を「外部参照」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
「Next」をクリックします。「サービス名」ページが表示されます。
「サービス名」フィールドにAirline2
と入力します。
「Next」をクリックします。「アダプタ・インタフェース」ページが表示されます。
「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
「操作タイプ」として「アウトバウンド同期リクエスト/リプライ」を選択します。
「Next」をクリックします。「ソケット接続」ページが表示されます。
「ソケット接続JNDI名」フィールドにeis/socket/OutboundSocketAdapter
と入力して「ホストおよびポートの指定」を選択します。
「ホスト名」フィールドにAirline2ソケット・サーバー・プログラムを実行するシステムの名前を入力し、「ポート番号」フィールドに9002
と入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
「メッセージ・スキーマのリクエスト」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「Airline2.xsd」および「Source」を順番にクリックします。
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline2.xsd
ファイルが移入されます。
「メッセージ・スキーマのリプライ」ボックスの「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
「プロジェクトのスキーマ・ファイル」、「Airline2.xsd」および「flight-details」を順番にクリックします。
「OK」をクリックします。「メッセージ」ページの「URL」フィールドにAirline2.xsd
ファイルが移入されます。
「Next」をクリックします。「プロトコル」ページが表示されます。
「ハンドシェイクなし」を選択します。
「終了」をクリックします。「composite.xml」ページが図5-86のように表示されます。
次の手順に従って、Airline3サーバー・ソケットのアウトバウンドOracleソケット・アダプタ・サービスを作成します。
作成したコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続する手順は、次のとおりです。
図5-96に示すように、「コンポーネント」ウィンドウからSequence_1にswitchアクティビティをドラッグ・アンド・ドロップします。
switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。
図5-97に示すように、「<case>
」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。
ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。
図5-98に示すように、式として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」をクリックします。図5-99に示すように、JDeveloperの「BPEL_FIDS.bpel」ページが表示されます。
「<case>」セクションにassignアクティビティを追加します。
<case>セクションで、Invoke_1アクティビティの前に「コンポーネント」ウィンドウからassignアクティビティをドラッグ・アンド・ドロップします。
Assign_1アクティビティをダブルクリックします。Assignダイアログが表示されます。
「コピー操作」タブをクリックします。Assignダイアログが表示されます。
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
図5-100に示すように、Receive_1アクティビティの入力変数のソースとInvoke_1アクティビティの入力変数のソースの間にコピー操作を作成します。
ダイアログで「OK」をクリックします。「コピー操作の作成」ダイアログが表示されます。
「OK」をクリックします。
図5-101に示すように、「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」をクリックします。図5-102に示すように、「Transformation_1.xsl」(XSLマッパー・ツール)が表示されます。
「ファイル」、「すべて保存」を順番にクリックします。図5-103に示すように、Airline1サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
空の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ダイアログが表示されます。
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
図5-104に示すように、Receive_1アクティビティの入力変数のソースとInvoke_2アクティビティの入力変数のソースの間にコピー操作を作成します。
「コピー操作の作成」ダイアログで「OK」をクリックします。
「OK」をクリックします。
一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。
注意:
一時変数は、Airline2サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。
(x)で表された「変数」アイコンをクリックします。図5-105に示すように、「変数」ダイアログが表示されます。
「作成」アイコンをクリックします。図5-106に示すように、「変数の作成」ダイアログが表示されます。
変数タイプとして「メッセージ・タイプ」を選択します。
「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。
図5-107に示すように、「メッセージ・タイプ」、「パートナ・リンク」、「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
」ノードにリンクします。図5-108に示すように、「自動マップ・プリファレンス」ダイアログが表示されます。
図5-108 「自動マップ・プリファレンス」ダイアログが表示されている「Transformation_2.xsl」ページ
「OK」をクリックします。XSLマッピングを含むTransformation_2.xsl
(XSLマッパー・ツール)ファイルが表示されます。
「ファイル」、「すべて保存」を順番にクリックします。
図5-109に示すように、Airline2サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
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ダイアログが表示されます。
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
図5-110に示すように、Receive_1アクティビティの入力変数のソースとInvoke_3アクティビティの入力変数のソースの間にコピー操作を作成します。
「コピー操作の作成」ダイアログで「OK」をクリックします。
「OK」をクリックします。
一時変数を作成し、「<case>」セクションにtransformアクティビティを追加します。
注意:
一時変数は、Airline3サーバーからのフライト詳細の格納に使用されます。この情報は後でリプライ変数に追加されます。
(x)で表された「変数」アイコンをクリックします。図5-111に示すように、「変数」ダイアログが表示されます。
「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
変数タイプとして「メッセージ・タイプ」を選択します。
「メッセージ・タイプ」フィールドの端にある「メッセージ・タイプの参照」アイコンをクリックします。「タイプ・チューザ」ダイアログが表示されます。
図5-107に示すように、「メッセージ・タイプ」、「パートナ・リンク」、「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」をクリックします。図5-112に示すように、XSLマッピングを含むTransformation_3.xsl (XSLマッパー・ツール)ファイルが表示されます。
「ファイル」、「すべて保存」を順番にクリックします。図5-113に示すように、Airline3サーバーのフローが定義された状態で「BPEL_FIDS.bpel」ページが表示されます。
前述の手順で作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次の手順を実行する必要があります。
ServerおよびClient Javaプログラムを実行して、アプリケーションをテストする必要があります。詳細は、関連するREADMEファイルを参照してください。
クラスタ化環境とは、単一のIPアドレスを持つ単一のマシンで複数の管理対象サーバーが実行される環境のことです。インバウンドOracleソケット・アダプタをクラスタ化環境にデプロイしようとすると、管理対象サーバーの1つで、サーバーのポートがすでに使用されているというエラー・メッセージが表示されます。
ただし、ソケット・アダプタではクラスタ化環境のサポートが提供されています。クラスタ化環境で例外をスローしないようにソケット・アダプタを構成できます。
垂直クラスタ環境でのみ、単一の物理マシン上で複数の管理対象サーバーを実行できることに注意してください。水平クラスタ環境では、これは該当しません。
垂直クラスタ・トポロジには、カンマ区切りのポートが必要です。
ソケット・アダプタをクラスタ化環境で使用するように構成するには、該当するコネクション・ファクトリ内で、ソケット・アダプタが使用するポートをカンマ区切りリストで指定する必要があります。
ポートのカンマ区切りリストを構成すると、アダプタはリスト内の最初のポートでサーバー・ソケットを開始しようとします。
ソケット・アダプタは、サーバー・ソケットの開始に失敗すると、リスト内の次のポートを試行します。ソケット・アダプタは、いずれかのポートでサーバー・ソケットを開始するまで、引き続きソケットの開始を試行します。
指定したいずれのポートでもサーバー・ソケットを開始できない場合、ソケット・アダプタはoracle.tip.adapter.socket.SocketServerCreationException
をスローします。
ソケット・アダプタは、Coherenceレイヤーを使用してポート・リストからポートを取得します。管理対象サーバー上のインバウンド・ソケット・アダプタの各インスタンスは、リストからポートをフェッチし、フェッチしたポートをソケット・アダプタの他のインスタンスから見えないようにします。
インバウンド・ソケット・アダプタは、フェッチしたポートを正常に開いた場合、フェッチしたポートをリストから削除します。
それ以外の場合、フェッチしたポートはインバウンド・ソケット・アダプタの他のインスタンスから可視になります。管理対象サーバー上のインバウンド・ソケット・アダプタの他のインスタンスは、リストの同じポートを開こうとしません。
クラスタ化環境でソケット・アダプタのサポートを有効化するには、インバウンド・ソケット・アダプタに対してポートのリストを指定する必要があります。リストを指定するには、図5-118に示すように、WebLogicコンソールを開き、ポートのカンマ区切り値でJNDIコネクション・ファクトリの「ポート」プロパティを更新する必要があります。