Oracle Tuxedo JCA Adapter (Tuxedo JCA Adapter)はJCA Connector Architectureに基づいています。また、Javaアプリケーション・サーバーを、Oracle Tuxedoアプリケーション・ドメイン内のGWTDOMAINゲートウェイに接続し、Oracle Tuxedoとの双方向のアクセスを可能にします。Tuxedo JCA AdapterとGWTDOMAINゲートウェイ間の接続には、単純なまたは独自の形式の(高パフォーマンス) TCPソケット接続、、リンク・レベル暗号化、または業界標準のSSL/TLSを使用できます。いずれの接続タイプでも、Tuxedo JCA Adapterは、アプリケーション・レベルのTDOMAINセッションを作成し、TDOMAINプロトコルによってOracle Tuxedo GWTDOMAINゲートウェイと通信します。
TDOMAINプロトコルは、堅牢かつ強力なプロトコルです。このプロトコルは同期または非同期リクエストの応答、会話、Oracle Tuxedoのキュー操作、アイデンティティ伝播、トランザクション伝播およびドメイン認証をサポートします。
Tuxedo JCA Adapterは、リンク・レベルとサービス・レベルの両方のフェイルオーバーをサポートします。リンク・レベルのフェイルオーバーは、マルチ・ホスト・サーバー向けに設計されているので、プライマリ・ネットワーク・インタフェースが動作していない場合に、同一マシン上の別のネットワーク・インタフェースに切り替えることができます。また、リンク・レベルのフェイルオーバーは、GWTDOMAINゲートウェイを介して同じサービス・セットを提供する2つのOracle Tuxedoアプリケーション・ドメインで使用することもできます。プライマリ・ドメインが停止した場合や使用不可能になった場合に、バックアップ・ドメインを使用して接続とTDOMAINセッションを作成します。
サービス・レベルのフェイルオーバーでは、プライマリ・アクセス・ポイントが使用不可能になった場合に、バックアップ・リモート・アクセス・ポイントにサービス・リクエストを転送できます。リンク・レベルのフェイルオーバーとサービス・レベルのフェイルオーバーでは、対象となるオブジェクトが異なります。リンク・レベルのフェイルオーバーは接続に対して、サービス・レベルのフェイルオーバーはサービスに対して作用します。これらは互に独立していますが、連携して高可用性をもたらします。
いずれのタイプのアクセス・ポイントでもname
とidentifier
を使用できます。name
は、構成内でアクセス・ポイントの構成エントリを識別するために使用します。つまり、その構成内で一意にする必要があります。identifier
は、TDOMAINセッションの確立時にアクセス・ポイントを指定するために使用します。つまり、相互接続したすべてのドメイン間でグローバルに一意にする必要があります。
また、いずれのタイプのアクセス・ポイントにも1つまたは複数のネットワーク・アドレスを関連付けることができます。唯一異なる点は、デフォルトのローカル・アクセス・ポイントが構成されていないことです。ただしかわりに、動的に生成され、動的な登録の受入れが可能なリモート・アクセス・ポイントに再登録されます。
ローカル・アクセス・ポイントとリモート・アクセス・ポイントは、Oracle TuxedoドメインBDMCONFIG
の構成ファイルでは、それぞれDM_LOCAL_DOMAINS
とDM_REMOTE_DOMAINS
に対応します。
Tuxedo JCA Adapterは、TDOMAINセッションと呼ばれる、GWTDOMAINゲートウェイとのアプリケーション・セッションを作成します。このセッションにはローカル・アクセス・ポイントとリモート・アクセス・ポイントが1つずつ必要です。TDOMAINセッションは接続の上位に位置し、また、TDOMAINプロトコルで通信する2つのエンティティ間のプロトコルの交換を処理します。
注意: | ローカル・アクセス・ポイントとリモート・アクセス・ポイントが通信できるようにセッションを構成する必要があります。 |
Tuxedo JCA Adapterのセッション・プロファイルにはセッションの特徴が記述されます。セッション・プロファイルには、構成可能な情報(接続ポリシー、セキュリティ、ブロック・タイムなど)が含まれます。また、セッションにはそのセッションに関連付けられたセッション・プロファイルが必要です。構成されていない場合は、デフォルトのセッション・プロファイルが使用されます。
Oracle Tuxedoのリソースは、JavaクライアントからCCIまたはJATMIを使用してアクセスできるようにインポートする必要があります。インポートしたリソースにはname
とRemoteName
があります。「name
」は、JCAクライアントがTuxedo JCA Adapterに対して使用するリモート・リソース構成エントリを指示するために使用されます。「RemoteName
」は、エクスポートされたリソースをリモート・アクセス・ポイントが参照する際に使用する実際の名前です。2つ以上のTDOMAINセッションが同じ構成エントリを使用して同じサービスを提供する場合、インポート済で同じ名前を持つすべてのOracle Tuxedoリソース間でロード・バランシングが行われます。
Tuxedo JCA Adapterは2つのロード・バランシング・アルゴリズムをサポートしています。デフォルトのロード・バランシング・アルゴリズムはRoundRobin
ですが、Random
に変更できます。Tuxedo JCA Adapterがインポート用に構成されていない場合、ロード・バランスを使用して構成されているすべてのリモート・アクセス・ポイント間ですべてのクライアント・リクエストが分散されます。これをデフォルト・インポートと呼びます。
Javaリソースは、クライアントからアクセスできるようにエクスポートする必要があります。エクスポート可能なリソースには次の3つのタイプがあります。
これらのリソースを構成しデプロイすると、Oracle Tuxedo ATMIクライアントはどのリソースに対してもパートナOracle Tuxedoアプリケーション・ドメインからアクセスできるようになります。
Tuxedo JCA Adapterにはユーザー構成が必要です(この構成はリソース・アダプタ・デプロイメント記述子の他に必要です)。少なくとも、リモート・アクセス・ポイントを構成する必要があります。Tuxedo JCA Adapterを構成する場合、次の3つの方法があります。
リソース・アダプタ・デプロイメント記述子ベースの構成は、単純で簡単な構成の場合に使用します。すべての構成情報はリソース・アダプタ・デプロイメント記述子(ra.xml
)に記述されます。構成にはローカル・アクセス・ポイント、リモート・アクセス・ポイントおよびセッション・プロファイルが含まれます。セッションは各ローカル・アクセス・ポイントから各リモート・アクセス・ポイントに対して暗黙的に定義されます。すべてのセッションで1つのセッション・プロファイルを共有します。
接続ファクトリ・ベースの構成は、複雑性と機能性の面で中間に位置します。また、接続ファクトリに関する追加情報を構成できます。そのファクトリを使用して作成した接続はすべて、同じ構成情報を継承します。各ファクトリの構成情報は互いに独立しています。各ファクトリの実際の構成情報は、リソース・アダプタ・デプロイメント記述子の構成情報と接続ファクトリ構成を組み合せたものです(接続ファクトリ構成が優先されます)。一部のJavaアプリケーション・サーバーでは、コンソールを使用してこれらの構成属性を構成できます。
構成ファイル・ベースの構成では、XMLベースの構成ファイルを個別に作成する必要があります。この構成方法はTuxedo JCA Adapterを構成するうえで最も完全な方法と言えます。追加のプライバシと保護が必要な情報が構成に含まれる場合は、Tuxedo JCA Adapterのツール(com.oracle.tuxedo.tools.DMConfigChecker)
を使用して、それらの要素を暗号化し、適切に難読化されたキー・ファイルを生成する必要があります。このキー・ファイルは暗号化された要素を実行時に復号化する際に使用します。このツールはTuxedo JCA Adapterに付属されています。
注意: | 2つ以上の構成スタイルの組合せはサポートされていません。前述のスタイルの中から1つのみを選択できます。 |
Tuxedo JCA Adapterのインストールとデプロイには、次の前提条件が必要です。
Tuxedo JCA Adapterリリース12cは1つの.ZIPファイルで配布されています(Oracle Webサイトからダウンロードできます)。この.ZIP
ファイルは、Tuxedo JCA Adapter一式とJDeveloper用のTuxedo JCA Adapter SOA構成ウィザードを含む4つのファイルで構成されています。
ダウンロードした.zip
ファイルを、読み書きアクセス制御が正しく設定されたターゲット・ディレクトリにコピーします。ファイルを展開して内容を確認します。
表1に、Tuxedo JCA Adapterリソースの.zip
ファイルの内容を示します。
読取り/書込み権限が正しく設定されたパッケージ・ディレクトリにリソース・アーカイブ(RAR)ファイルをコピーできます。リソース・アーカイブを展開して内容をブラウズし、標準デプロイメント記述子を表示します。
表2に、Tuxedo JCA Adapterリソース・アーカイブ・ファイルの内容を示します。
注意: | com.bea.core.i18n_1.4.0.0.jar は、WebLogic Server以外のJavaアプリケーション用です。このファイルはWebLogic Serverを置換するために設定しないでください。オーバーライドする必要があるファイルは、WebLogic Serverのcom.bea.core.jatmi_xxxx.jar ファイルのみです。 |
注意: | Tuxedo JCA Adapterリソース・アーカイブには、Tuxedo JCA Adapterを有効化するための最新の修正ファイルが含まれています。その他のJavaアプリケーション・サーバーの場合、JATMI ファイルのオーバーライドは不要です。 |
Tuxedo JCA Adapterリリース12cは次のプラットフォームをサポートしています。
Tuxedo JCA AdapterのZIPファイルには、JDeveloper用のSOA構成ウィザードで使用する3つのファイルが含まれています。この機能を使用すると、SOAアプリケーションを構成して、Oracle Tuxedoアプリケーション・ドメイン内に存在するサービスにアクセスでるようになります。そのためには、JDeveloperでTuxedo JCA Adapter構成ウィザードが認識されるように、この3つのファイルを正しくインストールする必要があります。
Tuxedo JCA Adapter SOA構成ウィザード・パッチをインストールするには、次の手順を実行します。
com.oracle.tuxedo.adapter.tja_soa_1.3.0.0.jar
を$JDEVELOPER_HOME/jdev/lib/patches
にコピーします。tuxedoAdpater-config.xml
を$JDEVELOPER_HOME/integration/seed/soa/configuration
にコピーします。$JDEVELOPER_HOME/integration/seed/soa/configuration/soa-config.xml
を保存します。soa-config.xml
をTuxedo JCA Adapterの.zipファイルから$JDEVELOPER_HOME/integration/seed/soa/configuration
にコピーします。 JDeveloperは$JDEVELOPER_HOME
ディレクトリにインストールされます。
Tuxedo JCA Adapterリリース12cにはSOA用の構成ウィザードが含まれています。これはJDeveloper 11gR1リリース1 (11.1.1.4.0)をサポートしています。
Oracle Tuxedoアダプタは、次の3つの方法のいずれかを使用して構成できます。
注意: | 3つの方法のいずれかを選択してTuxedo JCA Adapterを構成する必要があります。3つを組み合せる方法は、サポートされていません。 |
XMLベースの構成ファイルを使用すると、Tuxedo JCA Adapterの能力をフルに使用して構成できます。構成要件が複雑なユーザーに適切です。この方法を使用して構成する場合、リソース・アダプタ・デプロイメント記述子のresourceadapter
要素で、resourceadapter-class
をcom.oracle.tuxedo.adapter.TuxedoResourceAdapter
と構成する必要があります。
リスト1に、XMLベースのdmconfig
ファイルを使用可能にする、リソース・アダプタ・デプロイメント記述子のフラグメントを示します。
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</resourceadapter-class>
…
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoManagedConnectionFactory</managedconnectionfactory-class>
…
</outbound-resourceadapter>
</resourceadapter>
…
一般にはra.xml
というファイル名で知られているリソース・アダプタ・デプロイメント記述子ベースの構成は、デプロイメント記述子のカスタム・プロパティを使用します。これはTuxedo JCA Adapterの構成機能の一部であり、クライアント側のみの操作に適切です。Tuxedo JCA Adapterを構成する簡単な方法です。
リソース・アダプタ・デプロイメント記述子方式を使用して構成するには、リソース・アダプタ・デプロイメント記述子のresourceadapter要素で、「"resourceadapter-class"
」を「com.oracle.tuxedo.adapter.TuxedoClientSideResourceAdapter
」と構成する必要があります。
リスト2に、カスタム・プロパティ・ベースの構成を可能にする、リソース・アダプタ・デプロイメント記述子のフラグメントを示します。
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoClientSideResourceAdapter</resourceadapter-class>
…
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoManagedConnectionFactory</managedconnectionfactory-class>
…
</outbound-resourceadapter>
</resourceadapter>
…
ファクトリ・ベースの構成では、ベンダー固有の方法を使用して、接続ファクトリを構成します。各接続ファクトリには独自の構成があります。リソース・アダプタ・デプロイメント記述子ベースの構成より、Tuxedo JCA Adapterの構成機能をより多く活用でき、より簡単にTuxedo JCA Adapterを構成できます。Tuxedo JCA Adapterを構成する最も簡単な方法です。
ファクトリ・ベースの構成方式を使用して構成するには、'resourceadapter'
要素の"resourceadapter-class"
にcom.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter
を、outbound-resourceadapter
要素のconnection-definition
のmanagedconnectionfactory-class
に値com.oracle.tuxedo.adapter.spi.TuxedoFBCManagedConnectionFactory
を構成する必要があります。
リスト3に、ファクトリ・ベースの構成を可能にする、リソース・アダプタ・デプロイメント記述子のフラグメントを示します。
…
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter</resourceadapter-class>
…
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoFBCManagedConnectionFactory</managedconnectionfactory-class>
…
</outbound-resourceadapter>
</resourceadapter>
デプロイメント記述子ファイルに/Domain構成(dmconfig
)が構成されているが、構成されている"resourceadapter-class"
クラスがcom.oracle.tuxedo.adapter.TuxedoResourceAdapter
ではない場合は、dmconfig
の情報は無視されます。
構成されているresourceadapter-class
クラスがTuxedoResourceAdapter
の場合は、すべてのリソース・アダプタ構成関連のカスタム・プロパティが無視されます。
デフォルトの構成とは、ある一部の構成オブジェクト・タイプの構成がどれも明示的に構成されていない場合に、それらの構成オブジェクト・タイプの構成が動的に生成される、Tuxedo JCA Adapterの機能を意味します。すべての構成オブジェクト・タイプがデフォルトの構成をサポートしているわけではありません。Local AccessPoint
、SessionProfile
、Session
およびImport
で使用できます。その他の構成オブジェクト・タイプ(Resources
、RemoteAccessPoint
、 Export
など)はこのタイプの構成をサポートしていません。
デフォルトの構成は3つの構成スタイルのすべてで機能します。状況により、LocalAccessPoint
、SessionProfile
、Session
およびImport
の構成が不要になります。その場合、dmconfig
ファイルでRemoteAccessPoint
、またはResource Adapter Deployment Descriptor
ファイルでremoteAccessPontSpec
、またはファクトリ・ベースの構成ファイルでremoteAccessPointSpec
を構成するのみで済む場合があります。これによりTuxedo JCA Adapterの操作性が大いに向上します。
default LocalAccessPoint
を使用しても、LocalAccessPoint
を構成せずに済むわけではありません。リスニング・エンド・ポイントはなく、Oracle Tuxedo GWTDOMAINゲートウェイからのインバウンド接続リクエストを受け入れません。可能な接続ポリシーはON_STARTUP
だけです。
dmconfig
ベースの構成およびデプロイメント記述子ベースの構成では、default LocalAccessPoint
を1つのみ持つことができますが、ファクトリ・ベースの構成の場合、各ファクトリで独自のdefault LocalAccessPoint
を持つことができます。
default LocalAccessPoint
は、使用時に、UUIDベースのLocalAccessPointId
を作成します。このUUIDベースのLocalAccessPointId
は、.lapid
という名前のファイルに書き込まれますが、ファクトリ・ベースの構成の場合、.lapid.<factory-name>
という名前のファイルが作成されます。
dmconfig
ベースの構成の場合、default LocalAccessPoint
はSSLをサポートしません。SSLを必要とする場合は、LocalAccessPoint
を構成する必要があります。
デプロイメント記述子ベースの構成の場合、default LocalAccessPoint
は限定的にSSLをサポートします。そのためには、リソース・アダプタ・デプロイメント記述子にカスタム・プロパティ identityKeyStoreFileName
、privateKeyAlias
、trustedKeyStoreFileName
を構成します。Key Store
、Identity Alias
およびTrusted Certificate Store
にはパスワード保護を構成できません。
ファクトリ・ベースの構成の場合、default LocalAccessPoint
はSSLをサポートします。Key Store、Identity AliasおよびTrusted Certificate Storeにパスワードを指定できます。
default LocalAccessPoint
が機能するようにするには、Oracle Tuxedo GWTDOMAINゲートウェイ構成により、この簡略化された/Domain構成が機能するようにする必要があります。
動的なRemoteAccessPoint (RAP)登録ができるようにGWTDOMAINゲートウェイを変更する必要があります。DYNAMIC_RAP
がYES
に設定されている場合、動的に登録されたRAPから、接続のステータスのメモリー内データベースの更新も行います。それらの動的に登録されたRAPからの接続が失われた場合、そのRAPに関する情報はメモリー内データベースから削除されます。
注意: | 動的なRemoteAccessPointの登録/挿入がTuxedo GWTDOMAINゲートウェイで有効化されている場合、REMOTE_DOMAINS セクションで構成されていないと、すべてのリモート・アクセス・ポイントがゲートウェイに接続できるとは限りません。 |
注意: | default LocalAccessPoint が有効化されている状態のTuxedo JCA Adapterのみが、リモートのOracle Tuxedo GWTDOMAINゲートウェイに接続できます。GWTDOMAINが接続リクエストを受信すると、リモート・ドメインが構成されているかどうかチェックします。構成されていない場合、DYNAMIC_RAP がYES に設定されているかどうかをチェックします。YES に設定されている場合、メッセージ・データをチェックして、リクエストが正当なTuxedo JCA Adapterからのものかどうかを確認します。 |
GWADM
を、DM MIB
を正しく処理するように変更して、動的に登録されたRAPの接続ステータスが反映されるようにする必要があります。動的に登録されたRAPからの接続が失われた場合、DM MIB
問合せが接続ステータスを正しく戻すように、メモリー内データベースのエントリも削除されます。
動的に登録されたRAPは、/DOMAIN
構成に無期限で追加されません。その存在がわかるのは、セッションが確立されている場合のみです。接続が失われると、存在は失われます。
Oracle Tuxedo /Domain DMIB
が呼び出すDM_CONNECTION
は、動的に登録されたすべての接続済のRemoteAccessPoint
を戻します。それ以外の動的に登録された未接続のRemoteAccessPoint
は表示されません。
それらの動的に登録されたRAPへのOPENCONNECTION DMIB
リクエストの接続はサポートされていません。
CLOSECONNECTION
Oracle Tuxedo /DMIB
リクエストは接続をクローズして、それらの動的に登録されたRemoteAccessPoint
からのセッションを削除し、接続ステータスUNKNOWN
を戻します。
CONNECTION_POLICY
のPERSISTENT_DISCONNECT
タイプが適用され、PERSISTENT_DISCONNECT
が有効な場合、任意のRAPからの接続リクエストはいずれも、動的に登録されているかどうかにかかわらず拒否されます。
dmconfig構成ファイルでSessionProfile
が構成されているかどうかに関わらず、アダプタに関するデフォルト・セッション・プロファイルは常に作成されます。dmconfig
ベースの構成とデプロイメント記述子ベースの構成では、デフォルトSessionProfile
は1つのみ存在でき、それがアダプタに関するデフォルトSessionProfile
になります。
dmconfig
ベースの構成を使用する場合、アダプタに関するデフォルトSessionProfile
は変更できませんが、デフォルト以外の異なるSessionProfile
が必要な場合、適切なSessionProfile
を構成し、ターゲットSession
に割り当てる必要があります。
一連のカスタム・プロパティを使用してリソース・デプロイメント記述子ベースの構成を使用する場合は、アダプタに関するデフォルトSessionProfile
を変更できます。デプロイメント記述子ベースの構成を使用する場合、固有セッション・プロファイルを明示的に構成できないので、このアダプタに関するデフォルトSessionProfile
が、すべてのセッションで使用されます。
ファクトリ・ベースの構成は、アダプタに関するデフォルトSessionProfile
に加え、ファクトリに関するデフォルトSessionProfile
もサポートします。この構成メソッドを使用する場合、アダプタに関するデフォルトSessionProfile
は変更できませんが、一連のファクトリ・カスタム・プロパティを使用してファクトリに関するデフォルトSessionProfile
を変更することはできます。接続ファクトリにより作成された接続に対してデフォルトSessionProfile
が適切でない場合、各接続ファクトリに対して、ファクトリに関するデフォルトSessionProfile
を構成できます。
表3に、デフォルト構成のSessionProfile
タイプ要素を示します。
注意: | 表3に示すように、リソース・アダプタ・デプロイメント記述子ファイルで構成されたSessionProfile 関連プロパティは、デフォルトSessionProfile の構造内で使用されます。 |
注意: | プロパティ名はリソース・アダプタ・デプロイメント記述子ベースの構成とファクトリ・ベースの構成で同じです。 |
リソース・アダプタ・デプロイメント記述子ベースの構成またはファクトリ・ベースの構成が使用される場合、またはdmconfig
ファイルにSession
が構成されていない場合は、すべてのローカル ・アクセス・ポイントとすべてのリモート・アクセス・ポイントの間に、セッションが暗黙的に作成されます。これはデフォルト・セッションと呼ばれます。デフォルト・セッションが使用される場合は、リソース・アダプタ・デプロイメント記述子ベースまたはdmconfig
ベースの構成が使用されるときにのみ、アダプタに関するデフォルトSessionProfile
を使用できます。ファクトリ・ベースの構成では、ファクトリに関するデフォルトSessionProfile
を使用します。独自のデフォルトSessionProfile
で構成されていないファクトリでは、アダプタに関するデフォルトSessionProfile
を使用します。
たとえば、2つのRemoteAccessPoint
が構成されていて、default LocalAccessPoint
が使用され、セッションが構成されていない場合は、2つのデフォルト・セッションが作成されます。1つが最初に構成されているRemoteAccessPoint
に対して、もう1つが2番目に構成されているRemoteAccessPoint
に対して作成されます。いずれのセッションもデフォルト・セッション・プロファイルを使用します。
Oracle Tuxedoサービスまたはリソースが構成されていない場合でも、Tuxedo JCA Adapterでは、構成されたセッションを介してリモートのOracle Tuxedoサービスまたはリソースにアクセスできます。この機能は、デフォルト・インポートと呼ばれます。1つ以上の構成されたOracle Tuxedoサービスまたはリソースがある場合、この機能は自動的に無効にされ、構成されたOracle TuxedoサービスまたはリソースをターゲットとするリクエストのみをOracle Tuxedoに転送できます。
Tuxedo JCA Adapter構成で、Oracle Tuxedoサービスまたはリソースがインポートとして構成されていない場合、リクエスト・フィルタリングは実行されず、リクエストはすべて、サービス・リクエスト起動で指定された名前を使用してOracle Tuxedoに転送されます。複数のセッションが構成されている、またはTuxedo JCA Adapterによって暗黙に作成されている場合、サービス・リクエストはすべて、RoundRobin
アルゴリズムによってそれらのセッションにロード・バランシングされます。
デフォルト・インポートが有効な場合、Tuxedo JCA Adapterは、接続済の任意のOracle Tuxedoアプリケーション・ドメインに対して構成されているすべてのセッションまたは暗黙的に作成されたデフォルト・セッションを介してすべてのOracle Tuxedoサービスまたはリソースにアクセスできます。
Tuxedo JCA Adapter構成ファイルは、リソース・アダプタ・デプロイメント記述子(ra.xml
)内で「dmconfig
」という名前のプロパティによって表されるXMLベースのファイルです。このプロパティ値は、構成ファイルへの絶対パスであるか、リソースarchive
(RAR)ファイルのリソースとして表すことができます。クライアントとサーバーの本格的な動作が必要な場合は、この方式の構成を使用する必要があります。
リスト4に、Tuxedo JCA Adapterで「dmconfig
」ファイルを使用する例を示します。この例では、構成ファイルへのフル・パス名は/home/work/adapter/dmconfig.xml
です。
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</ resourceadapter-class>
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>/home/work/adapter/dmconfig.xml</config-proper ty-value>
<config-property>
...
リスト5に、dmconfig.xml
というリソース・ファイル名を持つリソース・アーカイブの一部としてパッケージ化されているdmconfig
ファイルを使用するよう、Tuxedo JCA Adapterに指示する例を示します。ただし、アーカイブでこの構成リソース・ファイルが検出されない場合、現在の作業ディレクトリにある構成ファイルが使用されます。
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter< /resourceadapter-class>
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>dmconfig.xml</config-property-value>
<config-property>
...
Tuxedo JCA Adapter構成ファイルには、TuxedoConnector
というルート要素が1つだけあります。複合タイプTuxedoConnectorType
によって表されます。次の要素が含まれます(表4に示します)。
構成では、リスト6に示すように、<TuxedoConnector>
およ</TuxedoConnector>
タグを使用する必要があります。
<?xml version="1.0" encoding="UTF-8"?>
<TuxedoConnector>
...
</TuxedoConnector>
Resources
要素は、ResourceType
で表され、リソース・アダプタ実行環境を指定します。Tuxedo JCA Adapter構成ファイルでは、Resource
要素は1つのみ構成できます。表5に、ResourceType
要素を示します。
注意: | ResourceType 要素に対して定義されている属性はありませんが、RemoteAccessPoint では、TPUsrFile 要素をTpusrFile 要素でオーバーライドできます。 |
リスト7に、Resources
の構成例を示します。
<Resources>
<FieldTable16Classes>tuxedo.test.fml16.FieldTbl16</FieldTable16Classes>
<ViewFile32Classes>tuxedo.test.simpapp.View32</ViewFile32Classes>
<ApplicationPasswordEncrypted>tuxpassword</ApplicationPasswordEncrypted>
</Resources>
ApplicationPassowrdEncrypted
が構成されている場合、付属ユーティリティcom.oracle.tuxedo.tools.DMConfigChecker
を実行して、パスワードを暗号化し、また、オプションでキー・ストアを生成する必要があります。この場合、keyFileName
は、有効なキー・ストア・ファイルまたはキー・ストア・リソースを参照している必要があります。リソース・アダプタ・デプロイメント記述子でkeyFileName
が構成されていないと、Tuxedo JCA Adapterがパスワードを復号化できません。
リスト8に、キー・ストア・リソースが構成されていることをTuxedo JCA Adapterに通知する例を示します。
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</ resourceadapter-class>
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>dmconfig.xml</config-property-value>
<config-property>
<config-property>
<config-property-name>keyFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>foo.key</config-property-value>
<config-property>
...
ローカル・アクセス・ポイント要素は、LocalAccessPointType
で表されます。この要素は、リスニング・アドレスと予定されるリンクレベルのフェイルオーバー・アドレスを指定します。表6に、LocalAccessPointType
要素を示します。
|
|||||
SSLInfo
要素は、匿名の複合タイプです。構成に含まれている場合、その要素をすべて構成する必要があり、トランスポート・メカニズムとしてSSLが使用されます。含まれていない場合、トランスポート・メカニズムとしてTCP/IPが使用され、暗号化が必要ならリンク・レベルの暗号化を使用してデータの機密性を確保します。表7に、SSLInfo
要素を示します。
name
属性は、LocalAccessPointType
に対して定義されます。この属性は、LocalAccessPointType
で表される構成レコードの識別に使用されます。また、リスト9で示されるように、この属性はローカルで一意のローカル・アクセス・ポイント名を指定します。
<LocalAccessPoint name="LDOM1">
<LocalAccessPointId>Godfried</LocalAccessPointId>
<NetworkAddress>//neocortex:14001</NetworkAddress>
</LocalAccessPoint>
LDOM1
は、ローカルに一意である必要があります。Gotfried
は、グローバルに一意である必要があります。AccessPointId
要素が指定されない場合、name属性の値はAccessPointId
として使用されます。このシナリオでは、name属性の値は、グローバルに一意である必要があります。
デフォルトで、SSLはサーバー(接続リクエストの応答側)を認証するだけです。クライアント認証を有効化するには、MutualAuthenticationRequired
要素をtrue
に設定する必要があります。
リモート・アクセス・ポイント要素は、RemoteAccessPointType
で表されます。この要素は、リモートOracle Tuxedoドメイン・アクセス・ポイントのネットワーク・アドレスを定義します。表8に、RemoteAccessPointType
要素を示します。
リモートのTuxedoアクセス・ポイントとのセッションを確立しようとするときに、このリモート・アクセス・ポイントを識別するために使用される接続プリンシパル名として、デフォルトで使用されます。グローバルに一意である必要があります。
|
|||||
CustomApplicationKey
要素は、匿名の複合タイプです。指定しない場合、デフォルトのアプリケーション・キー・プラグインが使用されます。指定する場合、そのすべての要素を構成する必要があり、このリモート・アクセス・ポイントと通信するすべてのセッションに対して、CustomApplicationKey
プラグイン・クラスがロードされます。表9に、CustomApplicationKey
要素を示します。
name
属性は、RemoteAccessPoint
に対して定義されます。この属性は、ローカルで一意なリモート・アクセス・ポイント名を指定します。リスト10は、RemoteAccessPointType
のname
属性の例を示します。
<RemoteAccessPoint name="RDOM1">
<AccessPointId>Geneve</AccessPointId>
<NetworkAddress>//bluestar:11023</NetworkAddress>
<TpusrFile>/tja/lady-geneve/tpusr</TpusrFile>
</RemoteAccessPoint>
RDOM
1は、ローカルに一意である必要があります。Geneve
は、グローバルに一意である必要があります。AccessPointId
要素が指定されない場合、name属性の値はAccessPointId
として使用されます。このシナリオでは、name属性の値は、グローバルに一意である必要があります。
セッション・プロファイル要素は、SessionProfileType
で表されます。Tuxedo JCA Adapterローカル・アクセス・ポイントとOracle Tuxedoリモート・アクセス・ポイントの間のTDOMAINセッションに関するすべてのQoSパラメータを含みます。表10に、SessionProfileType
要素を示します。
name
属性は、SessionProfileType
に対して定義されます。この属性は、適切なセッション・プロファイルを取得するためにセッション・オブジェクトによって使用されます。リスト11は、SessionProfileType
のname
属性の例を示します。
<SessionProfile name="profile1">
<Security>DM_PW</Security>
<ConnectionPolicy>ON_STARTUP</ConnectionPolicy>
<ACLPolicy>Global</ACLPolicy>
<CredentialPolicy>Global</CredentialPolicy>
<RetryInterval>100</RetryInterval>
</SessionProfile>
セッション要素は、SessionType
で表されます。それは、ローカル・アクセス・ポイントとリモート・アクセス・ポイントの間の、許容される接続を指定します。ローカル・アクセス・ポイントとリモート・アクセス・ポイントの間には、1つのセッションだけを構成できます。表11に、SessionType
要素を示します。
PasswordPair
要素は、匿名の複合タイプです。最大で2つのパスワード・ペアを構成できます。これにより、Oracle Tuxedoドメイン・セッション認証のパスワードを構成できるようになります。表12に、PasswordPair
要素を示します。
name
属性は、SessionType
に対して定義されます。この属性は、TDOMAINセッションの識別に使用されます。リスト12は、SessionType
のname
属性の例を示します。
<Session name="session1_1">
<LocalAccessPointName>LDOM1</LocalAccessPointName>
<RemoteAccessPointName>RDOM1</RemoteAccessPointName>
<ProfileName>profile1</ProfileName>
</Session>
セッションが構成されない場合、Tuxedo JCA Adapterはデフォルトで、すべてのローカル・アクセス・ポイントとすべてのリモート・アクセス・ポイントの間にセッションを作成します。これらの動的に作成されたセッションは、デフォルトのセッション・プロファイルのみ使用できます。
インポート要素は、ImportType
で表されます。この要素は、Tuxedo JCA Adapterクライアントによってアクセスされる既存のリモートTuxedoアプリケーション・ドメイン・リソースを識別します。表13に、ImportType
要素を示します。
name
、autotran
およびtrantime
の、3つの定義済の属性があります。
name
JATMI tpcall()
がサービス名として使用するリソース名またはCCI execute()
が関数名として使用するリソース名を指定します。
autotran
AUTOTRAN
の有効/無効を切り替えます。受け入れる値は、true
かfalse
だけです。trueに設定された場合、Tuxedo JCA Adapterは、グローバルまたはローカルなトランザクションの外部でこのインポート済リソースがTuxedo JCA Adapterクライアントにより呼び出されるときに、リモートのOracle Tuxedoドメインとのトランザクションを開始します。
falseに設定された場合、クライアント・サービス・リクエストがグローバルまたはローカルなトランザクションの外部にあると、トランザクションは開始されません。ただし、falseに設定しても、このリモート・リソースのクライアント・サービス・リクエストによるグローバルまたはローカルなトランザクションへの参加が妨げられることはありません。
構成しない場合、リソース・アダプタ・デプロイメント記述子内の、アダプタに関するAUTOTRAN
プロパティが、AUTOTRAN
を決定するために使用されます。
trantime
このリソースのAUTOTRAN
のトランザクション・タイムアウト値を指定します。値の単位は秒です。指定しないのにAUTOTRAN
が必要とされる場合、リソース・アダプタ・デプロイメント記述子のappManagedLocalTxTimeout
プロパティが使用されます。
appManagedLocalTxTimeout
が使用されない場合、JVMプロパティcom.oracle.tuxedo.adapter.appManagedLocalTxTimeout
が使用されます。
com.oracle.tuxedo.adapter.appManagedLocalTxTime
JVMプロパティを指定しない場合、デフォルトの300秒になります。
リスト13に、TUXUPPER
という名前でインポートされたリソースを記述するImportType
のname
の例を示します。AUTOTRAN
トランザクションのタイムアウトは、10秒に設定されます。
<Import name="TUXUPPER" autotran="true" trantime="10">
<RemoteName>TOUPPER_1</RemoteName>
<SessionName>session1</SessionName>
<LocalBalancing>RoundRobin</LoadBalancing>
</Import>
エクスポート要素は、ExportType
で表されます。この要素は、リモートOracle Tuxedoアプリケーション・ドメインからアクセス可能なローカル・リソースです。表14に、ExportType
要素を示します。
name
属性は、ExportType
に対して定義されます。この属性は、エクスポートされたリソースの識別に使用されます。リスト14は、ExportType name
の例を示します。
<Export name="tolower">
<SessionName>session1</SessionName>
<RemoteName>wtolower</RemoteName>
<Type>EJB</Type>
<Source>tuxedo.services.TolowerEJBHome</Source>
</Export>
デプロイメントのためにリソース・アーカイブをデプロイし、再パッケージするために使用される主要コンポーネントは、リソース・アダプタ・デプロイメント記述子(META-INF
ディレクトリのra.xml
ファイル)です。リソース・アダプタ・デプロイメント記述子は、リソースをリソース・アーカイブに再パッケージする前に、構成する必要があります。
このXMLベースのテキスト・ファイルは、テキスト・エディタまたはXMLエディタで編集できます。ダウンロードしたTuxedo JCA Adapterには、Tuxedo JCA Adapterデプロイメントの構成を支援する、簡易版のデプロイメント記述子が含まれます。
デプロイメント記述子ベースの構成の場合、デプロイメント記述子ファイル(ra.xml
)を使用して、Tuxedo JCA Adapterデプロイメントの構成を指定する必要があります。構成を指定するための一連のカスタム・プロパティが存在します。この方法で指定されるすべてのプロパティは、スコープがアダプタ単位になります。
デプロイメント記述子ベースの構成スタイルは、標準の単純なプロパティ・タイプ、config-property-name
、config-property-type
およびconfig-property-value
に基づいています。これらのプロパティ・タイプは繰り返せません。これらは、リソース・アダプタ・デプロイメント記述子「resourceadapter
」ファイルのリソース・アダプタ・セクションで使用できます。
リソース・アダプタ・デプロイメント記述子構成メソッドは、次のタイプのプロパティをサポートします。
dmconfig
ファイルで指定される大部分のリソース要素は、デプロイメント記述子ベースの構成で使用できます。
表15に、リソース・アダプタ・デプロイメント記述子のResources
プロパティを示します。
リスト15に、リソース・アダプタ・デプロイメント記述子ベースのカスタム・プロパティ構成を使用した、2つのVIEW32クラス情報を記述する構成の例を示します。
注意: | これにより、Tuxedo JCA Adapterは、SYSTEM CLASSPATH を介してアクセスできるフル・パッケージ名で、viewFile32Classes を使用できます。 |
…
<config-property>
<config-property-name>viewFile32Classes<config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>tuxedo.view32.view1,tuxedo.view32.view2
</config-property-value>
</config-property>
…
LocalAccessPoint
タイプの要素の大部分は、リソース・アダプタ記述子ベースの構成では使用できませんが、単一のlocalAccessPointSpec
を指定することはできます。
表16に、リソース・アダプタ・デプロイメント記述子のLocalAccessPoint
プロパティを示します。
localAccessPointSpec
プロパティは任意です。非クラスタ環境で指定されるとき、このプロパティはリソース・アダプタ・デプロイメント記述子ファイル内の全構成情報を求める場合に有効です。ただし、構成がすべてのクラスタ・ノードにコピーされるクラスタ環境でこのプロパティが指定されるとき、すべてのTuxedo JCA Adapterは同一のアクセス・ポイントIDを持ちます。この場合には、接続の振る舞いが予測できなくなるため、サポートされません。デフォルト・セッション、およびデフォルトSessionProfile
のみ使用できます。
このようなクラスタ環境の問題を解決するため、環境は一切構成しないでください(この場合、default
LocalAccessPoint
がUUIDベースのLocalAccessPointId
を使用して作成されます)。このUUIDベースのLocalAccessPointId
は、現在の作業ディレクトリ内の.lapid
という名前のファイルに書き込まれます。
リスト16に、localAccessPointSpecのカスタム構成の例を示します。
<config-property>
<config-property-name>localAccessPointSpec</config-property-name>
<config-property-type>java.lang.String<config-property-type>
<config-property-value>//localhost:12345/domainId=jdom_id
</config-property-value>
</config-property>
この例では、AccessPointName
と、jdom_id
と等しいAccessPointId
を持つLocalAccessPoint
が作成されることを示しており、ローカル・ホスト上のport12345
に着信する接続リクエストをリスニングしています。
default
LocalAccessPoint
が作成される場合、可能な接続ポリシーはON_STARTUP
だけです。リスニング・エンド・ポイントは作成されません。
default LocalAccessPoint
がTuxedo JCA Adapterによって動的に構築される場合、リスニング・エンド・ポイントはなく、クライアント側専用の動作モードになります。接続リクエストは着信できません。
SSL/TLSも、IDとキー・ストアに関連する3つのプロパティを使用して、リソース・アダプタ・デプロイメント記述子を介してサポートされます。ただし、次の2つの制限事項があります。
この制限を望まない場合、異なる振る舞いが必要なすべてのノードのリソース・アダプタ・デプロイメント記述子を変更するか、またはdmconfig
メソッドを使用してクラスタリングされたTuxedo JCA Adapterを構成するかのいずれかを実行する必要があります。
RemoteAccessPoint
は、ネットワーク・アドレスとRemoteAccessPoint
アクセスごとの制御関連情報の両方を含むテキスト文字列で表されます。ただし、リソース・アダプタ・デプロイメント記述子のプロパティ・ベースの構成では、1つのremoteAccessPointSpec
プロパティで表されます。表17に、リソース・アダプタ・デプロイメント記述子のRemoteAccessPoint
関連プロパティを示します。
remoteAccessPointSpec
プロパティは、各リモート・アクセス・ポイントがコンマで区切られたリストになります。各リモート・アクセス・ポイントは、固有の書式で表されます。
プロパティrapApplicationKeyClass
を指定しない場合、rapApplicationKeyClassParam
は、構成されていても無視されます。
リンク・レベル・フェイルオーバーをサポートするために、カッコを使用して、RemoteAccessPoint
ごとにフェイルオーバー・アドレスがグループ化されます。グループ内で最初に指定されるアドレスがプライマリ・アドレスになります。グループの第2のアドレスは第1のアドレスのバックアップで、グループの第3のアドレスは第2のアドレスのバックアップ、以下同様です。
リスト17は、2つのRemoteAccessPoint
を構成する例です。1番目は、ドメインguinevre
を介して、ネットワーク・アドレス//bluestar:11023
でアクセスできます。2番目は、ドメインgalahad
を介してネットワーク・アドレス//orion:37456
でアクセスできます。
<config-property>
<cofig-property-name>remoteAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>//bluestar:11023/domainId=guinevre,//orion:37456/ domainId=galahad</config-property-value>
</config-property>
リモート・ドメインguinevre
とgalahad
には、同一のQoSが関連付けられています。この場合、rapApplicationKeyClass
およびrapApplicationKeyClassParam
が指定されると、それらがRemoteAccessPoint guinevre
とgalahad
の両方で利用できるかのように扱われます。rapApplicationKeyClass
を両方のRAPで同じ完全修飾クラス・パスを使用して利用できるようにする必要があります。そうしないと、Tuxedo JCA Adapterを開始できません。
リスト18は、フェイルオーバー・アドレスを持つ2つのRemoteAccessPoint
を構成する例です。1番目は、ドメインguinevre
を介して、プライマリ・ネットワーク・アドレス//bluestar:11023
、バックアップ・ネットワーク・アドレス//orion:12345
でアクセスできます。
2番目は、ドメインgalahad
を介してネットワーク・アドレス//orion:37456
、バックアップ・ネットワーク・アドレス//bluestar:37456
でアクセスできます。
<config-property>
<config-property-name>remoteAccessPointSpec</config-porperty-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>(//bluestar:11023,//orion:12345)/domainId=guinevr e,(//orion:37456,//bluestar:37456)/domainId=galahad
</config-property-value>
</config-property>
リソース・アダプタ・デプロイメント記述子ファイルに指定できるremoteAccessPointSpec
プロパティは1つのみです。複数構成されている場合、アプリケーション・サーバーのJCAコンテナは、最後に構成されたものだけを引き受けます。
デフォルトRemoteAccessPoint
がありません。remoteAccessPointSpec
プロパティが構成されないと、動的に作成されたRemoteAccessPoint
は存在しません。このため、Tuxedo JCA Adapterは、起動できますが役に立ちません。
remoteAccessPointSpec
プロパティを介してRemoteAccessPoint
を構成するには、リソース・アダプタ・デプロイメント記述子ファイル内で、resourceadapter-class
要素が、com.oracle.tuxedo.adapter.TuxedoClientSideResourceAdapter
クラスを使用して構成されている必要があります。
セッション・プロファイルに含まれる情報は、一連の構成プロパティによって表されます。Tuxedo JCA Adapterローカル・アクセス・ポイントとOracle Tuxedoリモート・アクセス・ポイントの間のTDOMAINセッションに関するすべてのQoSパラメータを含みます。
表18に、リソース・アダプタ・デプロイメント記述子のSessionProfile
プロパティを示します。
リスト19に、SessionProfile
の構成例を示します。
< config-property>
<config-property-name>spBlockTime</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>120000</config-property-value>
</config-property>
リソース・アダプタ・デプロイメント記述子ファイル内で構成されている、すべてのSessionProfile
関連プロパティは、デフォルトSessionProfile
の構造で使用されます。
リソース・アダプタ・デプロイメント記述子ファイル・ベースの構成は、デフォルトのインポートを使用しますが、アダプタからリモートのTuxedoアプリケーション・ドメインにアクセスできるものを統一的に制限する機能もあります。単一のimpResourceName
プロパティに、アクセスできるリモートのOracle Tuxedoサービス/リソースのコンマ区切りリストを指定できます。適用される1つの制限は、これらは、実行可能なすべてのセッションに適用されるということです。
LoadBalancing
アルゴリズムはRoundRobin
に初期設定されており、変更できません。impResourceName
を指定すると、Tuxedo JCA Adapterはデフォルトのインポートを作成しません。
表19に、リソース・アダプタ・デプロイメント記述子のインポート関連のプロパティを示します。
リスト20に、使用可能なリモートのOracle TuxedoリソースをToupper_1
とECHO
に制限するimpResourceName
の例を示します。このプロパティは、リソース・アダプタ・デプロイメント記述子ベースの構成に限定されているため、resourceadapter-class
を、TuxedoClientSideResourceAdapter
クラスを使用して構成する必要があります。
<config-property>
<config-property-name>impResourceName</config-property-name>
<config-property-type>java.lang.String</config-property-name>
<config-property-value>TOUPPER_1,ECHO</config-property-value>
</config-property>
リソース・アダプタ・デプロイメント記述子カスタム・プロパティ構成メソッドには、セッション関連のプロパティが定義されていません。リソース・アダプタ・デプロイメント記述子ベースの構成が使用されているか、dmconfigファイル内にSessionが構成されていない場合、すべてのローカル・アクセス・ポイントとすべてのリモート・アクセス・ポイントの間に、セッションが暗黙のうちに作成されます。これは、「デフォルト・セッション」と呼ばれます。デフォルト・セッションが使用される場合、デフォルトSessionProfile
のみ使用できます。
たとえば、2つのRemoteAccessPoint
要素が構成され、default LocalAccessPoint
が使用され、セッションが構成されていない場合、2つのデフォルト・セッションが作成されます。
リソース・アダプタ・デプロイメント記述子カスタム・プロパティ構成メソッドには、エクスポート関連のプロパティは定義されていません。Oracle Tuxedoアプリケーション・ドメインからJavaアプリケーション・サーバーへのインバウンド・リクエストをサポートするデフォルト・エクスポートはありません。また、これは3つの構成スタイルのすべてに該当します。
ファクトリ・ベースの構成は、リソース・アダプタ・デプロイメント記述子ベースの構成に類似しています。どちらもカスタム・プロパティを使用してTuxedo JCA Adapterを構成します。この2つの方式の違いは、ファクトリ・ベースの構成では接続ファクトリのカスタム・プロパティを構成する点にあります。ファクトリ・ベースの構成を使用すると、より大きなカスタム・プロパティ・セットを使用してより最適な構成ができるようになります。
ファクトリ・ベースの構成には、2つの主要な部分があります。片方はアダプタに関するプロパティで、カスタム・プロパティを使用して、デプロイメント記述子ファイルのresourceadapter
で構成する必要があります。もう一方はファクトリに関するプロパティで、Javaアプリケーション・サーバーごとに異なる方法で構成できます。WebSphereの場合は、J2C接続ファクトリのカスタム・プロパティのページを介して構成され、WebLogicの場合は、weblogic-ra.xml
内で構成されます。
通常はTuxedo JCA Adapterをインストール後に構成します。リソース・アダプタ・デプロイメント記述子を構成した後で、カスタム・ファクトリのプロパティを構成します。
ResourceAdapterデプロイメント記述子にはカスタム・プロパティ一式があり、ファクトリ-ベース構成がサポートしています。それが存在するのは、すべてアダプタに関するプロパティだからです。
これらのプロパティは、標準の単純なプロパティ・タイプ、config-property-name
、config-property-type
およびconfig-property-value
に基づいています。これらのプロパティ名は繰り返せません。これらは、リソース・アダプタ・デプロイメント記述子のresourceadapter
で使用できます。
ファクトリ・ベースの構成のためのリソース・アダプタ・デプロイメント記述子カスタム・プロパティは、次のタイプのプロパティをサポートします。
アダプタに関するプロパティは、すべての接続ファクトリで使用できます。ファクトリ・ベースの構成が使用できる、アダプタに関するプロパティはほとんどありません。ただし、それらはファクトリ構成内にある同じ名前のプロパティでオーバーライドできます。これらのプロパティがファクトリで構成されていない場合、ファクトリは、これらのアダプタに関するプロパティ構成を使用します。
表20に、ファクトリ・ベースの構成がサポートするリソース・アダプタ・デプロイメント記述子内にある、アダプタに関するそれらのカスタム・プロパティを示します。
ファクトリ・ベースの構成におけるAUTOTRAN
トランザクション・タイムアウトの実行優先度の順序を次に示します。
アダプタに関するappManagedLocalTxTimeout
は、リソース・アダプタ・デプロイメント記述子(RADD)ファイル(ra.xml)内のresourceadapter
タイプで、config-property
として構成されます。
リスト21に、ra.xml
ファイル内にトランザクション・タイムアウトが設定されているAUTOTRAN
を使用する例を示します。
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter</resourceadapter-class>
<config-property>
<config-property-name>autoTran</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>appManagedLocalTxTimeout</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>50</config-property-value>
<config-property>
…
リソース関連プロパティは、すべてのファクトリで使用でき、リソース・アダプタ・デプロイメント記述子を使用して構成されます。デプロイメント記述子のresourceadapter
タイプで構成されます。唯一の例外はアプリケーション・パスワードで、柔軟性を求めて各ファクトリで使用できるようにされており、このリソース関連プロパティでは使用できません。
表21 リソース関連のプロパティに示されたプロパティはすべてオプションです。
リスト22に、ファクトリ・ベースの構成に対して、リソース・アダプタ・デプロイメント記述子に2つのVIEW32クラス(view1およびview2)情報を記述する構成例を示します。
…
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter</resourceadapter-class>
<config-property>
<config-property-name>viewFile32Classes<config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>tuxedo.view32.view1,tuxedo.view32.view2 </config-property-value>
</config-property>
…
接続ファクトリに対して構成できるプロパティには3つのタイプがあります。
アダプタに関するいくつかのプロパティは、各ファクトリ構成に対して指定でき、ファクトリのアダプタに関するプロパティをオーバーライドします。ファクトリで指定しない場合、ファクトリはアダプタに関する構成をこれらのプロパティに使用します。
ファクトリ・ベースの構成におけるAUTOTRAN
の実行優先度の順序を次に示します。
リスト23に、weblogic-ra.xml
ファイルの例を示します。
…
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resources.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory1</jndi-name>
<connection-properties>
<properties>
<property>
<name>autoTran</name>
<value>true</value>
</property>
<property>
<name>appManagedLocalTxTimeout</name>
<value>50</value>
</property>
…
接続ファクトリ名は、connectionFactoryName
プロパティを使用して指定できます。このプロパティはオプションですが、この接続ファクトリによって作成された接続を使用して開始されたサービス・リクエストに対してトランザクションが可能である場合は、構成しておくことをお薦めします。また、DMMIB
を使用してOracle TuxedoのDomain構成内に動的にDM_REMOTE_DOMAINS
を構成する場合も、構成しておくことをお薦めします。
表23に、接続ファクトリのプロパティを示します。
リスト24に、weblogic-ra.xml
ファイルの例を示します。
…
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resources.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory1</jndi-name>
<connection-properties>
<properties>
<property>
<name>autoTran</name>
<value>true</value>
</property>
<property>
<name>connectionFactoryName</name>
<value>TuxedoConnectionFactory1</value>
</property>
…
このプロパティが構成され、default LocalAccessPoint
が構成されている場合、.lapid.<connectionFactoryName>
という名前のファイルが現在の作業ディレクトリに作成されます。このファイルには、動的に生成されたLocalAccessPoint IDが含まれます。たとえば、前述の例では、.lapid.TuxedoConnectionFactory1
という名前のファイルが作成されます。
リソースのアプリケーション・パスワードは、RADDベースの構成ではサポートされませんが、ファクトリ・ベースの構成にはファクトリに関するプロパティとして構成できます。このプロパティはファクトリごとに使用でき、異なるファクトリで異なるアプリケーション・パスワードを持つことが容易に可能になります。RADDベースの構成には、これに相当するものはありません。
ファクトリ・ベースの構成のapplicationPassword
プロパティは、表24に示すように、クリア・テキストにも暗号文にもできます。暗号文を使用して構成するには、com.oracle.tuxedo.tools.EncryptPassword
の出力を使用する必要があります。次に、サンプル出力を示します。
c:\tuxedo\JCA\adapter> java -classpath %classpath% com.oracle.tuxedo.tools.EncryptPassword mypassword foo.key
Encrypted Password: {Salted-AES}WBGk6LjHuI515pwXPTfaOQ==
WebSphere 7.0以降では、このツールを使用してパスワードを暗号化する必要はありません。暗号化はWebSphere内で処理されます。
表25に、ファクトリ・ベースの構成のためのLocalAccessPoint
関連プロパティを示します。
SSL関連のプロパティは7つあります。そのうちの6つはキー・ストアおよび証明書ストアに関連しており、SSLが要求される場合に構成する必要があります。SSLを使用する際のオプションとなる唯一のプロパティは、mutalAuthenticationRequired
です。
デフォルトでは、mutualAuthenticationRequire
はfalse
になっています。必須の6つのプロパティのいずれか1つがないと、SSLは無視されます。Toniは、セッション・プロファイル情報に加え、リモートのOracle Tuxedo GWTDOMAINゲートウェイとのセッション・ネゴシエーションにも依存しており、LLEを使用します。
localAccessPointSpec
プロパティの指定は、オプションです。指定しない場合、default LocalAccessPoint
が使用されます。default LocalAccessPoint
がこのファクトリに対して使用される場合、connectionFactoryName
も構成しておくことをお薦めします。
リスト25に、weblogic-ra.xml
ファイルの例を示します。
…
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resources.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory1</jndi-name>=
<connection-properties>
<properties>
<property>
<name>localAccessPointSpec</name>
<value>//localhost:123456/domainId=JDOM</value>
</property>
…
RemoteAccessPoint
は、ネットワーク・アドレスとRemoteAccessPoint
アクセス制御関連の情報の両方によって表されます。最も重要なプロパティは、remoteAccessPointSpec
です。これは、コンマで区切られたリストです。コンマによって各RemoteAccessPoint
が区切られます。表26に、ファクトリ・ベースの構成で使用できるRemoteAccessPoint関連のプロパティを示します。
各RemoteAccessPoint
は、固有の書式で表されます。ファクトリを使用可能にするためには、remoteAccessPointSpec
を構成する必要があります。
リスト26に、RemoteAccessPoint weblogic-ra.xml
ファイルの例を示します。
…
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resources.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory1</jndi-name>
<connection-properties>
<properties>
<property>
<name>autoTran</name>
<value>true</value>
</property>
<property>
<name>localAccessPointSpec</name>
<value>//localhost:123456/domainId=JDOM</value>
</property>
<property>
<name>remoteAccessPointSpec</name>
<value>//bluestar:11023/domainId=guinevre,//orion:37654/domainId=galahad<value>
</property>
…
remoteAccessPointSpec
は各ファクトリに1つのみ指定できます。rapApplicationKeyClass
とrapApplicationKeyClassParam
を指定すると、guinevre
とgalahad
両者のアイデンティティ通知のために使用されます。
RemoteAccessPointSpec
プロパティは、より多くのRemoteAccessPointおよびSession関連の属性を構成できるように拡張されました。これらの属性はコンマで区切られます。各属性は、名前と値のペアです。次に、サポートされる属性のリストを示します。
セッション認証がDM_PW
の場合、1つ以上のパスワード・ペアが有効である必要があります。パスワード・ペア1とパスワード・ペア2が有効である場合、パスワード・ペア1はセッション認証情報を暗号化するために使用されます。
ファクトリ・ベースの構成のlPasswd1
、lPasswd2
、rPasswd1
およびrPasswd2
の各属性は、クリア・テキストと暗号文のいずれも可能です。暗号文を使用して構成するには、com.oracle.tuxedo.tools.EncryptPassword
の出力を使用する必要があります。次に、サンプル出力を示します。
c:\tuxedo\JCA\adapter> java -classpath %classpath% com.oracle.tuxedo.tools.EncryptPassword mypassword foo.key
Encrypted Password: {Salted-AES}WBGk6LjHuI515pwXPTfaOQ==
リスト27に、weblogic-ra.xml
ファイルのRemoteAccessPointSpec
プロパティの例を示します。
…
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resources.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory</jndi-name>
<connection-properties>
<properties>
<property>
<name>spSecurity</name>
<value>DM_PW</name>
</property>
<property>
<name>remoteAccessPointSpec</name>
<value>//localhost:123456/domainId=TUX_ID,lPasswd1=weblogic,rPassword=tuxedo</value>
</property>
…
表27に、ファクトリ・ベースの構成のデフォルトSessionProfile
のデフォルト値を示します。
このGWTDOMAINセッションにアプリケーション・レベルのキープ・アライブが構成されているかどうかと、その場合に待機タイマーが計時を開始するまでのアイドル・タイムの最大値を指定します。デフォルト値は
0 で、アプリケーション・レベルのキープ・アライブが無効であることを意味します。単位はミリ秒です。
|
|||
リスト28に、SessionProfileプロパティのweblogic-ra.xml
ファイルの例を示します。
…
<connection-instance>
…
<connection-properties>
…
<properties>
<property>
<name>spBlockTime</name>
<value>120000</value>
</property>
…
</connection-instance>
ファクトリ・ベースの構成ではデフォルト・インポートを使用できますが、アダプタからリモートのTuxedoアプリケーション・ドメインに統一的にアクセスできるものを制限することもできます。各ファクトリに対して"impResourceName"
プロパティを1つのみ指定できますが、これは、Tuxedo JCA AdapterクライアントがアクセスできるリモートのOracle Tuxedoサービス/リソースのコンマ区切りリストを含んでいます。
LoadBalancing
アルゴリズムは指定できず、常にRoundRobinを使用します。サービス・リクエストは、その個別の接続ファクトリのすべてのRemoteAccessPoints
にわたってロード・バランシングされます。
表28に、ファクトリ・ベースの構成でインポートに関連する新しいプロパティを示します。
リスト29に、weblogic-ra.xml
ファイルの例を示します。
…
<connection-instance>
…
<connection-properties>
<properties>
<property>
<name>impResourceName</name>
<value>TOUPPER,ECHO</value>
</property>
…
</connection-instance>
Tuxedo JCA Adapter LocalAccessPoint
をリモートのOracle Tuxedo GWTDOMAINゲートウェイに接続するセッション。ファクトリ・ベースの構成では、明示的にセッションを指定する必要がないため、使用できるSession
関連のプロパティはありません。ファクトリ内で使用できるセッションはすべてデフォルト・セッションになります。
Tuxedo JCA Adapterは、接続ファクトリで可能なLocalAccessPoint
とRemoteAccessPoint
のすべての組合せに対してセッションを作成します。接続ファクトリ構成当たり、1つのLocalAccessPoint
しか存在できないため、多くとも1xN
個のセッションのみ可能です(ここで、N
はRemoteAccessPoint
の数です)。リスト30は、セッションを使用する例を示しています。
<property>
<name>localAccessPointSpec</name>
<value> //localhost:12345/domainId=JDOM</value>
</property>
<property>
<name>remoteAccessPointSpec</name>
<value>//localhost:13456/domainId=TDOM1,//blues:23457/domainId=TDOM2</value>
</property>
ファクトリ・ベースの構成で使用できる、エクスポート関連のプロパティはありません。
Tuxedo JCA Adapterのファクトリ・ベースの構成を、リスト31に示します。ファイル名は任意の名前を付けることができます。TJA-ds.xml
を取得し、たとえば、このファイルを$JBOSS_HOME/server/$BOOTMODE/deploy
ディレクトリにコピーしてください。
<?xml version="1.0"?>
<connection-factories>
<tx-connection-factory>
<jndi-name>eis/TuxedoConnectionFactory</jndi-name>
<use-java-context>false</use-java-context>
<rar-name>com.oracle.tuxedo.TuxedoAdapter.rar</rar-name>
<connection-definition>javax.resource.cci.ConnectionFactory</connection-defini
tion>
<max-pool-size>50</max-pool-size>
<config-property name="autoTran"
type="java.lang.Boolean">true</config-property>
<config-property name="connectionFactoryName"
type="java.lang.String">Factory1</config-property>
<config-property name="localAccessPointSpec"
type="java.lang.String">//bej301151:2497/domainId=JDOM</config-property>
<config-property name="remoteAccessPointSpec"
type="java.lang.String">//bej301151:3138/domainId=TDOM1</config-property>
<config-property name="spBlockTime"
type="java.lang.Integer">20000</config-property>
<config-property name="spInteroperate"
type="java.lang.Boolean">false</config-property>
<config-property name="spCredentialPolicy"
type="java.lang.String">Local</config-property>
<config-property name="spRetryInterval"
type="java.lang.Long">60</config-property>
<config-property name="spMaxRetries"
type="java.lang.Long">1000</config-property>
<config-property name="spCompressionLimit"
type="java.lang.Integer">1000000</config-property>
<config-property name="spMinEncryptBits"
type="java.lang.String">56</config-property>
<config-property name="spMaxEncryptBits"
type="java.lang.String">128</config-property>
<config-property name="spKeepAlive"
type="java.lang.String">0</config-property>
<config-property name="spKeepAliveWait"
type="java.lang.Long">200000</config-property>
<config-property name="impResourceName"
type="java.lang.String">UPDATE_DB1,UPDATE_DB2,CLEAN_DB1,CLEAN_DB2,COUNT_DB1,CO
UNT_DB2,UPDATE_FAIL_DB1,TIMEOUT_DB1,FAILSVC_DB1,FAILSVC_DB2,UPDATE_FAIL_DB2</c
onfig-property>
</tx-connection-factory>
</connection-factories>
Tuxedo JCA Adapterのファクトリ・ベースの構成は、WebLogicのweblogic-ra.xml
ファイルを介して行います。構成の例は、ここまでの項にあります。リスト32に、完全なサンプル構成を示します。
<?xml version="1.0"?>
<weblogic-connector
xmlns="http://www.bea.com/ns/weblogic/90">
<jndi-name>eis/TuxedoConnector</jndi-name>
<enable-access-outside-app>true</enable-access-outside-app>
<enable-global-access-to-classes>true</enable-global-access-to-classes>
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resource.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory1</jndi-name>
<connection-properties>
<properties>
<property>
<name>remoteAccessPointSpec</name>
<value>//localhost:12478/domainId=TDOM1_ID</value>
</property>
</properties>
</connection-properties>
</connection-instance>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory2</jndi-name>
<connection-properties>
<properties>
<property>
<name>spSecurity</name>
<value>APP_PW</value>
</property>
<property>
<name>applicationPassword</name>
<value>{Salted-AES}hHAsW13whgqTobG1t9Q92Q==</value>
</property>
<property>
<name>remoteAccessPointSpec</name>
<value>//localhost:12488/domainId=TDOM2_ID</value>
</property>
</properties>
</connection-properties>
</connection-instance>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory3</jndi-name>
<connection-properties>
<properties>
<property>
<name>spSecurity</name>
<value>DM_PW</value>
</property>
<property>
<name>localAccessPointSpec</name>
<value>//localhost:10801/domainId=JDOM_ID</value>
</property>
<property>
<name>remoteAccessPointSpec</name>
<value>//localhost:12498/domainId=TDOM3_ID,
lPasswd1={Salted-AES}xNgOdUuXB7Z49D0cssluxA==,
rPasswd1={Salted-AES}hAIzbPI+YyaeuHX0A9Umqg==</value>
</property>
</properties>
</connection-properties>
</connection-instance>
</connection-definition-group>
</outbound-resource-adapter>
</weblogic-connector>
通常はTuxedo JCA Adapterをインストール後に構成します。先にRADDベースのアダプタに関するプロパティを構成してから、ファクトリ・プロパティを構成できます。
次に示すのは、WebSphereコンソールからRADD内のアダプタに関するプロパティを構成する手順です。
リソース 'Resource Adapters
' リソース・アダプタ
「Tuxedo JCA Adapter」という名前を使用すると仮定します。
Resource Adapters
' リソース・アダプタ ' Tuxedo JCA Adapter。「追加プロパティ」の下、右側にある「カスタム・プロパティ」をクリックします。
カスタム・プロパティ表の上部で「プリファレンス」をクリックします。コンソールが拡張されて最大行入力フィールドを追加できるため、デフォルト値を「60
」に変更してから、入力フィールド・ボックスの右下にある「適用」ボタンをクリックし、ボックスにチェックマークを入れます。
これで、すべての構成可能なアダプタに関するプロパティを表示できるはずです。
remoteAccessPointSpec
目的のremoteAccessPointSpec
値を「値」フィールドに追加するか、変更して、「適用」ボタンをクリックし、「保存」をクリックします。
WebSphere 7.0のapplicationPassword
プロパティを構成する場合、WebSphere 7.0がパスワードを暗号化するため、com.oracle.tuxedo.tools.EncryptPassword
ツールを使用してパスワードを暗号化する必要はありません。
WebSphereのファクトリ・ベースの構成を構成するには、次の手順を実行します。
「Tuxedo JCA Adapter」と名前を付けると仮定します。
「追加プロパティ」の下、右側でJ2C接続ファクトリをクリックします。
「名前」フィールドに接続ファクトリ名を入力し、「JNDI name」フィールドに一意のJNDI名を入力してから、ページの一番下で「適用」ボタンをクリックします。
「名前」フィールドに「factory1
」と入力したと仮定します。
「保存」ボタンをクリックします。J2C接続ファクトリのページに戻ります。
「名前」列で「factory1
」をクリックします。ページ「factory1」に戻ります。
「追加プロパティ」の下、右側にある「カスタム・プロパティ」をクリックします。
factory1
' カスタム・プロパティ、 「名前」列でプロパティ名をクリックすると、プロパティのページに移動します。「"localAccessPointSpec"
」を選択したとします。
localAccessPointSpec
、「値」フィールドに値を入力し、「適用」ボタンをクリックして、「保存」をクリックします。「カスタム・プロパティ」ページに移動します。
リソース・アダプタのデプロイメントは、アプリケーション・サーバーによって変わります。通常、次の手順で行います。
Tuxedo JCA Adapterのデプロイには、デプロイメント・モードの選択、リソース・アダプタ記述子の構成、アダプタの再パッケージ化、およびJCA 1.5/1.6準拠JEEアプリケーション・サーバーへのデプロイが含まれます。ほとんどの場合、ra.xml
ファイル(META-INF
ディレクトリにあります)を変更して、アダプタを起動し、実行中の状態にするだけで済みます。
注意: | ほとんどの場合、ra.xml ファイル(META-INF ディレクトリにあります)を変更して、アダプタを起動し、実行中の状態にするだけで済みます。 |
注意: | リソース・アーカイブの構成と再パッケージ化の手順は、ターゲット・アプリケーションのタイプとは無関係に同一です。しかし、Tuxedo JCA Adapterのデプロイメントは、アプリケーション・サーバーによって異なります。 |
注意: | 詳細は、ターゲット・アプリケーション・サーバーのドキュメントを参照してください。 |
Oracle JCA Adapterをデプロイするには、次のタスクが必要です。
com.oracle.tuxedo.TuxedoAdapter.rar
ファイルをディレクトリに展開します。META-INF/ra.xml
を削除します。META-INF/client-side.ra.xml
を削除します。META-INF/sample.weblogic-ra.xml
の削除META-INF/server.ra.xml
の名前をMETA-INF/ra.xml
に変更します。ra.xml
ファイルを変更します。dmconfig
プロパティを指定する必要があります。dmconfig.xml
を変更します。dmconfig.xml
ファイルの名前を、dmconfig
プロパティが指定した任意の名前に変更します。dmconfig
ファイルをリソース・アーカイブの一部として扱わない場合は、希望するディレクトリへ移動します。.jar
化して、リソース・アダプタ・アーカイブを作成します。注意: | 一部のアプリケーション・サーバーではコンソールを介した接続プール情報の構成が必要になる場合があります。一部のアプリケーション・サーバーではアダプタのアクティブ化が必要になる場合があります。 |
Tuxedo JCA Adapterに構成されているアダプタ・クラスがTuxedoResourceAdapter
、TuxedoClientSideResourceAdapter
またはTuxedoFBCResourceAdapter
のいずれかであることを確認します。
TuxedoResourceAdapter
を使用する場合、dmconfig
プロパティを構成する必要があります。構成されたdmconfig
プロパティに、パス情報を持たないファイル名だけが含まれている場合、リスト33に示すように、構成はリソースとしてロードされます。
リソース・アーカイブからロードできない場合、現在の作業ディレクトリにあるファイルとみなされます。ファイルを開くことができない場合、リソース・アダプタは起動せず、ResourceAdapterException
がスローされます。
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>dmconfig.xml</config-property-value>
</config-property>
構成されたdmconfig
プロパティにパス情報が含まれる場合、リスト34に示すように、ファイルとして扱われ、ロードされます。ファイルが開くことができない場合、リソース・アダプタは起動せず、ResourceAdapterException
がスローされます。
…
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>/user/dilbert/tja/dmconfig.xml
</config-property-value>
</config-property>
…
dmconfig
ファイルでLocalAccessPoint
が構成されていない場合は、単一のdefault LocalAccessPoint
が作成されます。default LocalAccessPoint
は、デフォルトSessionProfile
を使用するRemoteAccessPoint
とのセッションしか持てません。
アダプタは、すべてデフォルト値を使用して、デフォルトSessionProfile
を作成します(ただしデフォルトSessionProfile
に対しては常にON_STARTUP
となるConnectionPolicy
を除く)。dmconfig
ファイルでSessionProfile
が構成されている場合、デフォルトSessionProfile
に追加して作成されます。
dmconfig
ファイルでセッションが構成されていない場合は、デフォルトSessionProfile
を使用して構成されている各LocalAccessPoint
と各RemoteAccessPoint
の間にデフォルト・セッションがアダプタによって作成されます。
リソース記述子ra.xml
ファイルのresourceadapter-class
要素には、リスト35
に示すように、値としてcom.oracle.tuxedo.adapter.TuxedoResourceAdapter完全修飾クラス名が含まれるはずです。
…
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.
TuxedoResourceAdapter</resourceadapter-class>
…
注意: | 新しい「クライアント側」モード・プロパティは、このクラス・ベースのリソース・アダプタでは使用できません。リソース・アダプタ・デプロイメント記述子ファイルにそれらのプロパティを構成する場合、動作はアプリケーション・サーバーにより異なります。 |
TuxedoClientSideResourceAdapter
が構成されている場合、dmconfig
構成は無視されます。このリソース・アダプタのクラスが構成される場合、すべての構成情報が、アプリケーション・サーバーのJCAコンテナが提供するリソース・アダプタJava Beanに含まれると想定されます。
localAccessPointSpec
プロパティが構成されない場合、リソース・アダプタ・デプロイメント記述子ファイル・ベースの構成に対してデフォルトのLocalAccessPoint
が作成されます。
remoteAccessPointSpec
プロパティが構成される場合、RemoteAccessPoint
を構築するために使用されます。remoteAccessPointSpec
プロパティが構成されていない場合、構成は使用できず、警告メッセージがアダプタ・ログファイルに記録されます。
デフォルトのSessionProfile
は、セッション・プロファイルに関連するプロパティからの情報を使用して作成されます。セッション・プロファイル関連のプロパティが構成されていない場合、デフォルト値だけを使用してデフォルトのSessionProfile
が構築されます。LocalAccessPoint
からすべてのRemoteAccessPoint
までのセッションが、デフォルトのSessionProfile
を使用して作成されます。
リソース記述子ra.xml
ファイルのresourceadapter-class
要素には、リスト36
に示すように、値としてcom.oracle.tuxedo.adapter.TuxedoClientSideResourceAdapter完全修飾クラス名が含まれるはずです。
…
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.
TuxedoClientSideResourceAdapter</resourceadapter-class>
…
TuxedoFBCResourceAdapter
が構成されている場合、dmconfig
構成と、リソース・アダプタ・デプロイメント記述子固有の構成のプロパティは無視されます。このリソース・アダプタのクラスが構成される場合、すべての構成情報が、アプリケーション・サーバーのJCAコンテナが提供するリソース・アダプタJava Beanと管理対象接続ファクトリJava Beanに含まれると想定されます。
ファクトリに対してlocalAccessPointSpec
プロパティが構成されない場合、デフォルトのLocaAccessPoint
がそのファクトリに作成されます。各ファクトリに対してremoteAccessPointSpec
が構成される必要があり、それはRemoteAccessPoint
を構築するために使用されます。
各ファクトリに対して、そのファクトリのSessionProfile
と関連があるプロパティからの情報を使用してデフォルトのSessionProfile
が作成されます。ファクトリに対してセッション・プロファイル関連のプロパティが構成されていない場合、ファクトリはアダプタに関するデフォルトSessionProfile
を使用します。
リソース・デプロイメント記述子ra.xml
ファイルのresourceadapter-class
要素には、リスト37
に示すように、値としてcom.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter完全修飾クラス名が含まれるはずです。
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.
TuxedoFBCResourceAdapter</resourceadapter-class>
...
3つのスタイルの構成(リソース・アダプタ・デプロイメント記述子ベースの構成、ファクトリ・ベースの構成、dmconfig
ベースの構成)のすべてで使用できる、一連のリソース・アダプタ・デプロイメント記述子カスタム・プロパティがあります。唯一の例外は、dmconfig
ベースの構成を使用してのみ利用できるdmconfig
カスタムプロパティです。リソース・アダプタ・デプロイメント記述子ベースの構成を使用しているときにこのプロパティを指定した場合、このプロパティは無視されます。
ra.xml
ファイル内の一部のプロパティは、内部的にTuxedo JCA Adapterまたはその記述情報に関係しているため、変更しないことをお薦めします。ただし、動作とアプリケーションをカスタマイズするために変更する必要があるプロパティもあります。
config-property
要素は、通常、標準JCAデプロイメント記述子META-INF/ra.xml
ファイル内でTuxedo JCA Adapterカスタム・プロパティを定義するために使用されます。表29に、Tuxedo JCA Adapterをカスタマイズするために使用されるプロパティを示します。
リソース・デプロイメント記述子META-INF/ra.xml
ファイル内のdmconfig
プロパティを使用して、Tuxedo JCA Adapter構成ファイルを指定する必要があります。詳細は、『Tuxedo JCA Adapterプログラミング・ガイド』で、構成ファイルの例を参照してください。
表30に、トレース・レベル制御値を示します。
注意: | 20,000未満のトレース・レベルではトレースは実行されません。 |
リスト38に、カスタマイズ・プロパティを使用するデプロイメント記述子ファイルの例を示します。
<config-property>
<config-property-name>traceLevel</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>0</config-property-value>
</config-property>
<config-property>
<config-property-name>xaAffinity</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>keyFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>foo.key</config-property-value>
</config-property>
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>dmconfig.xml</config-property-value>
</config-property>
<config-property>
<config-property-name>throwFailureReplyException</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property-value>
</config-property>
<config-property>
<config-property-name>appManagedLocalTxTimeout</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>15</config-property-value>
</config-property>
大部分のアプリケーション・サーバーでは、リソース・アダプタを非アーカイブ形式でデプロイすることが許容されています。しかし、リソース・デプロイメント記述子を変更したら、アダプタを再パッケージ化してからデプロイするのがベストです。
再パッケージ化には、JDK付属の"jar"
コマンドを使用して、Tuxedo JCA Adapterをリソース・アーカイブに変換する必要があります。リソース・アーカイブは".rar"
という拡張子を持っています。
たとえば、リソース・アーカイブのルート・ディレクトリから、次のコマンドを使用します: jar -cvf ../com.oracle.tuxedo.TuxedoAdapter.rar *
アプリケーション・サーバーには、デフォルトの接続プール・サイズがあります。大部分のアプリケーションでは、デフォルト接続プール・サイズに余裕がありますが、状況により、デフォルト接続プール・サイズでは十分でない場合があります。たとえば、Oracle WebLogicサーバーは10
というデフォルト接続プール・サイズを持っています。これは、同じアダプタを使用してリモートの企業情報システム(EIS)にアクセスするために、最大で10台の同時JCAクライアントをサポートできることを意味します。あるアプリケーションが、Tuxedo JCA Adapterを使用して10台以上の同時クライアントをサポートする場合、アプリケーションは接続プール・サイズを拡張する必要があります。
たとえば、Oracle WebLogicサーバー・インストールにおいて、デフォルト値から20
まで接続プール・サイズを変更するには、リスト39に示すように、META-INF
ディレクトリでweblogic-ra.xml
ファイルを変更します。
<outbound-resource-adapter>
<default-connection-properties>
<pool-params>
<initial-capacity>15</initial-capacity>
<max-capacity>20</max-capacity>
</pool-params>
</default-connection-properties>
<connction-definition-group>
...
</connection-definition-group>
</outbound-resource-adapter>
注意: | 接続プール・サイズの構成方式はアプリケーション・サーバーによって異なります。一部のアプリケーション・サーバーでは、カスタム・デプロイメント記述子を使用して、接続プール・サイズを構成します(Oracle WebLogic Serverなど)。別のアプリケーション・サーバーでは、コンソール構成を使用します(IBM WebSphereなど)。 |
注意: | 詳細は、アプリケーション・サーバーのドキュメントを参照してください。 |
Tuxedo JCA Adapterをデプロイした後に、アプリケーションを拡張または変更したくなることがあります。その場合、アダプタ構成を変更する必要があります。Tuxedo JCA Adapter構成の変更には、テキスト・エディタまたはXMLエディタを使用して、構成されたアダプタ構成の内容を変更することが含まれます。
Oracle WebLogicサーバーおよびJBOSSアプリケーション・サーバー環境では、次の手順を実行する必要があります。
注意: | IBM WebSphereアプリケーション・サーバーの場合、アプリケーション・サーバーを停止してから再起動する必要があります。 |
Tuxedo JCA Adapterが実行時の動的な構成変更をサポートする際には、構成の変更を有効にするために停止して再起動します。
Tuxedo JCA Adapterは、リンク・レベルのフェイルオーバーとサービス・レベルのフェイルオーバーの両方をサポートします。リンクレベルのフェイルオーバーによって、ユーザーは異なるアクセス・ポイント・ネットワーク・アドレスを指定できるようになります。これは、ローカル・アクセス・ポイントとリモート・アクセス・ポイントの両方に適用できます。
dmconfig
ファイル構成では、RemoteAccessPoint
とLocalAccessPoint
に、複数のNetworkAddress
要素を指定できます。これらのネットワーク・アドレスの順序は、プリファレンスの順序を表しています。Tuxedo JCA Adapterは、リスニングのエンドポイントを確立するために、LocalAccessPoint
の1つ目のネットワーク・アドレスを使用しようとします。失敗すると、次のネットワーク・アドレスを試します。これは、リスニング・エンドポイントが確立されるまで、またはすべてのネットワーク・アドレスが使い果たされるまで行われます。
Tuxedo JCA Adapterは、リモートのOracle Tuxedo GWTDOMAIN
ゲートウェイとの接続を確立するために、1つ目のネットワーク・アドレスの使用を試みます。失敗すると、次のネットワーク・アドレスを試します。これは、接続が確立されるまで、またはすべてのネットワーク・アドレスが使い果たされるまで行われます。ただし、リンクレベルのフェイルバックはありません。リスト40は、dmconfig
ファイル構成を使用して、ローカル・アクセス・ポイントLDOM1
がリンクレベルのフェイルオーバーに対して2つのネットワーク・アドレスを持つ例を示しています。また、リモート・アクセス・ポイントRDOM1
がリンクレベルのフェイルオーバーに対して2つのネットワーク・アドレスを持っていることも示しています。
...
<LocalAccessPoint name="LDOM1">
<AccessPointId>Godfried</AccessPointId>
<NetworkAddress>//neocortex:14001</NetworkAddress>
<NetworkAddress>//cerebrum:14002</NetworkAddress>
</LocalAccessPoint>
<RemoteAccessPoint name="RDOM1">
<AccessPointId>Geneve</AccessPointId>
<NetworkAddress>//bluestar:11023</NetworkAddress>
<NetworkAddress>//orion:11023</NetworkAddress>
</RemoteAccessPoint>
...
リンクレベルのフェイルオーバーの他に、Tuxedo JCA Adapterはサービスレベルのフェイルオーバーもサポートします。サービスレベルのフェイルオーバーは、リモートのOracle Tuxedoリソースにアクセスできる代替のセッションを指定します。これは、コンマ区切りリストです。ロード・バランシングとは異なります。サービスレベルのフェイルオーバーを使用できるのは、ConnectionPolicy
がON_STARTUP
に等しい場合だけです。他のタイプのConnectionPolicy
には、ロード・バランシングのみがあります。
サービスレベルのフェイルオーバーが有効な場合、プライマリ・セッションのセッション・ステータスを確認します。そのステータスが接続済でない場合、最初のバックアップ・セッションを確認します。以下、バックアップ・セッションに接続済ステータスが検出されるか、構成されているバックアップ・セッションをすべて使い果たすまで、同様に続きます。
リスト41は、インポートされたリソースTOUPPER
が、session_1
とsession_2
の間でロード・バランシングされる例を示しています。
...
<Import name="TUXTOUPPER">
<SessionName>session_1</SessionName>
<SessionName>session_2</sessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
...
リスト42では、ロード・バランシングのみならず、サービス・レベルのフェイルオーバーも可能な例を示します。
...
<Import name="TUXTOUPPER">
<SessionName>session_1,session_3</SessionName>
<SessionName>session_2,session_3</sessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
...
前述の構成は、session_1
とsession_2
の間のロード・バランシングです。session_1
が使用できない場合、ロード・バランシング・アルゴリズムがsession_1
の番と判定したときに、session_3
にサービス・リクエストが転送されます。session_2
についても同様です。この事例ではsession_3
もsession_2をバックアップします。
特定のインポート済リソースのすべてのセッションに対して、ConnectionPolicy
がON_STARTUP
に設定されている場合、サービスレベルのフェイルバックは自動です。前述の例でsession_1
が使用できない場合、session_1
に宛てられたすべてのサービス・リクエストが、session_3
にルーティングされます。session_1
が使用可能になると、サービス・リクエストは、プライマリ・ルートのsession_1
にルーティングされます。
Tuxedo JCA Adapterは、リンクレベルの暗号化またはSecured Socket Layerを使用するデータ・セキュリティをサポートします。また、アプリケーション・サーバーからOracle TuxedoへのアウトバウンドID通知機能もあります。これにより、Oracle Tuxedoリソースのアクセスをきめ細かく制御できます。
セキュリティを確保するためにDMConfigChecker
ユーティリティが使用されます。このユーティリティは、構成ファイルをスキーマと照合するだけでなく、パスワードを暗号化形式に変換してセキュリティを向上させます。暗号化が必要な場合、Tuxedo JCA Adapterを開始する前にDMConfigChecker
を実行する必要があります。詳細は、 『Oracle Tuxedo JCAリファレンス・ガイド』を参照してください。
リンク・レベルの暗号化(LLE)は、Tuxedo JCA AdapterとTuxedo TDomainゲートウェイの間のすべてのユーザー・メッセージ・フローを暗号化する、高速の独自規格テクノロジです。40ビット、56ビットおよび128ビット暗号強度をサポートします。この機能を有効にするには、アダプタ構成の SessionProfile
で、MaxEncryptBits
とMinEncryptBits
を構成します。
MaxEncryptBits
のデフォルト値は128-bit
で、MinEncryptBits
のデフォルト値は0です。両方の要素で許される値は、0(暗号化なし)、40-bit
、56-bit
、128-bit
および256-bit
です。256-bit
暗号化は、SSL AES 256ビット暗号化用です(LLEは256ビット暗号化をサポートしません)。MinEncryptBits
値はMaxEncryptBits
値以下である必要があります。
注意: | SSLが構成されていず、MaxEncryptBits が256ビットに設定されている場合、MaxEncryptBits は最大の128ビットLLEにスケールダウンされます。 |
注意: | LLEは、GWTDOMAIN ゲートウェイでも構成する必要があります。 |
Tuxedo JCAアダプタは、Secure Socket Layer (SSL)暗号化もサポートします。SSL暗号化を有効化するには、次の手順を実行する必要があります。
MinEncryptBits
およびMaxEncryptBits
を構成します。 SSLInfo
を構成します。 Javaキー・ストア(JKS)がサポートされます。IdentityKeyStoreFileName
とTrustKeyStoreFileName
は、どちらもJKSタイプを参照します。
注意: | 相互認証はデフォルトで無効ですが、MutualAuthenticationRequired 要素をtrue に設定することで有効にできます。 |
サンプルのSSLInfo
構成例を、リスト43に示します。
<LocalAccessPoint name="jdom">
...
<SSLInfo>
<IdentityKeyStoreFileName>c:\test\cert\test_users.jks</IdentityKeyStoreFileName>
<IdentityKeyStorePassPhraseEncrypted>passphrase</IdentityKeyStorePassPhraseEncrypted>
<PrivateKeyAlias>tester</PrivateKeyAlias>
<PrivateKeyPassPhraseEncrypted>passphrase</privatekeypassphraseencrypted>
<TrustKeyStoreFileName>c:\test\cert\trusted.jks</TrustKeyStoreFileName>
<TrustKeyStorePassPhraseEncrypted>passphrase</TrustKeyStorePassPhraseEncrypted>
</SSLInfo>
</LocalAccessPoint>
この例では、DMConfigChecker
ユーティリティを先に実行することで、Tuxedo JCA Adapterがユーティリティを使用できるようになります(暗号化が必要な要素が3つあるため)。
SSLが構成されない場合、Tuxedo JCA Adapterはセッション認証をサポートしますが、SessionProfile
の「Security」が、「DM_PW
」または「APP_PW
」を使用して構成されている必要があります。
セキュリティが「APP_PW
」を使用して構成されている場合、Oracle Tuxedoのアプリケーション・パスワードをキーとして使用して、認証者を暗号化/復号します。Tuxedo JCA Adapterには、1つのアプリケーション・パスワードのみを構成できます。このパスワードは、構成ファイル内のResources "ApplicationPasswordEncrypted
"要素で構成されます。
セキュリティが「DM_PW
」で構成されている場合、ドメイン・パスワードをキーとして使用して、認証者を暗号化復号します。構成されるいかなるセッションに対しても、最大で2つのパスワード・ペアを構成できます。
各パスワード・ペアは、1つのローカル・パスワードと1つのリモート・パスワード、およびそのアクティブ化/非アクティブ化時刻から構成されています。アクティブ化/非アクティブ化時刻では、書式「YYYY:MM:DD:hh:mm:ss
」を使用します(例: 2009:01:01:12:00:00
)。
非アクティブ化時刻は、アクティブ化時刻より後である必要があります。アクティブ化時刻を指定しない場合、アダプタが起動したときに、パスワードがすでにアクティブ化されていることを示します。非アクティブ化時刻を指定しない場合、パスワードは決して期限切れになりません。
セッションがすでに確立されている間にパスワード・ペアが期限切れになっても、セッションは無効にならず、セッション・ネゴシエーション・プロセスが再起動されます。ただし、ネゴシエーションが開始される前にパスワード・ペアが期限切れになった場合、そのパスワード・ペアは認証に使用されません。セッション認証の際に、有効なパスワード・ペアが検出されない場合、セッションを確立できません。
ローカル・アクセス・ポイントでSSLが必要な場合、そのローカル・アクセス・ポイントとあらゆるリモート・アクセス・ポイントの間のセッションではSSLを使用して、データ保護メカニズムを明確に示します。この場合、SessionProfile/Security
が正しい値に構成されていても、セッション認証は実行されません。
AppKeyジェネレータは、アプリケーション・サーバーからOracle Tuxedoに送信されるユーザー情報を決定するために使用されるプラガブル・クラスです。Oracle Tuxedoは、この情報を使用して、Oracle Tuxedoリソースへのユーザー・アクセス権を決定します。これは、ACLとも呼ばれます。
Tuxedo JCA AdapterにはデフォルトのAppKeyジェネレータ・クラスが事前構成されており、デフォルトのOracle Tuxedo認証、認可および監査プラグイン(AAA)で機能します。ただし、デフォルトOracle Tuxedo AAAプラグインを使用するアクセス制御が必要な場合、リモート・アクセス・ポイントでTpusrFile
要素を構成する必要もあります。RemoteAccessPoint
のTpusrFile
要素は、Oracle Tuxedoのtpusr
ファイルを参照します。
それを実行する最も簡単な方法は、ファイルをOracle Tuxedoからコピーするか、Oracle Tuxedoと共有することです(両方とも同じマシン上で動作している場合)。RemoteAccessPoint
TpusrFile
ファイルが構成されていない場合、Oracle JCA AdapterはResourcesセクションでもTpusrFile
ファイルを探します。
また、CredentialPolicy
を「Global
」に設定して、AAAセキュリティ・トークンがTuxedo JCA AdapterからOracle Tuxedoアプリケーション・ドメインにネットワークを横断して移動できるようにする必要もあります。
RemoteAccessPoint
にある他の構成要素を使用すると、AppKeyジェネレータ・プラグインをさらにカスタマイズできます。AllowAnonymous
要素は、Oracle Tuxedoへの匿名アクセスを許すかどうかをアダプタに指示します。
注意: | デフォルトでは、匿名アクセスは許容されません。アプリケーション・サーバーは認証を実行します。 |
DefaultApplicationKey
は、Oracle Tuxedoにアクセスするために匿名ユーザーが使用するキー値です(デフォルト値は「-1
」です)。デフォルトのAppKeyジェネレータは、匿名のユーザー名が「anonymous
」と想定しています。
アイデンティティ通知を成功させるためには、(以前に説明したすべての構成オプションに加えて)ホスト・アプリケーション・サーバーのJCAコンテナで「Principal Mapping
」情報を構成する必要があります。
詳細は、ターゲット・アプリケーション・サーバーのドキュメントを参照してください。
Oracle JCAアダプタ構成ファイル・アイデンティティ通知の例を、リスト44に示します。
<RemoteAccessPoint name="tdom">
...
<TpusrFile>c:\test\data\tpusr</TpusrFile>
<AllowAnonymous>true</AllowAnonymous>
...
</RemoteAccessPoint>
<SessionProfile name="prof_1">
...
<CredentialPolicy>global</CredentialPolicy>
...
</SessionProfile>
Oracle Tuxedo Application-To-Monitor-Interface (ATMI)は、使いやすい会話モデルを定義します。この項では、Tuxedo JCA Adapterの機能を使用する方法を説明します。アプリケーション・アーキテクチャでATMIスタイルの会話を利用する必要があるアプリケーションと併用することを目的としています。
ATMI会話は、Javaクライアントによって開始される会話(JavaクライアントとOracle Tuxedo会話型サーバーの間のアウトバウンド会話)を処理するために追加されたTuxedo JCA Adapter拡張機能です。
注意: | この製品は、Oracle Tuxedo ATMIクライアントからのインバウンド会話をサポートしません。 |
Oracle Tuxedo ATMI会話は半二重会話です(つまり制御された方法で送受信が行われます)。会話の制御権を持っている側がデータを送信できます。そちらの側が会話の制御権を放棄するときには、データとともにTPRECVONLY
フラグを送信します。相手側が最後のデータを受信すると、TPSENDONLY
に変換されているフラグを参照して、会話の制御権を取得したことを認識します。
Javaクライアントは、tpconnect()
をコールすることによって会話を開始し、リモートのOracle Tuxedo会話型サーバーとの会話を確立します。Javaクライアントは、tpsend()
を使用して、リモートの会話型サーバーにデータを送信し続けることができます。Javaクライアントがデータを送信し終わると、サーバーに最後のtpsend()
とともにTPRECVONLY
フラグを送信します。
サーバーがこのデータを受信すると、Javaクライアントがデータを送信するときであると判断するまでの間、逆にJavaクライアントに向けてデータを送信します。会話が完了するまで、これらの送受信シーケンスが数回繰り返されます。会話が完了するとサーバーはtpreturn()
を送信し、Javaクライアントは会話が完了したことを示すイベントを受信します。
JavaクライアントとOracle Tuxedoサーバーの間の制御交代数の上限値は32768
です。
アウトバウンド会話は、次のJavaクライアント用Oracle Tuxedo ATMI会話型サービス・インタフェースをサポートします。
会話制御の交代は、tpconnect
、tpsend
およびtprecv
メソッド用の1ペアのフラグを使用して行われます。これらのフラグは、weblogic.wtc.jatmi.TPException
クラスで定義されます。そのフラグは次のとおりです。
Javaクライアントは、Tuxedo JCA AdapterのInteractionクラス、TuxedoInteraction
の実装に含まれるtpconnect()
機能拡張を使用して会話を開始します。会話が正常に開始された場合、TuxedoInteraction
クラスのtpconnect()
メソッドが、会話オブジェクトを戻します。Javaクライアントは戻された会話オブジェクトを使用して、引き続き、tpsend()
およびtprecv()
オブジェクト・インタフェースを使用してOracle Tuxedo会話型サーバーと通信できます。
通常の会話が完了するには、Oracle Tuxedo会話型サーバーが会話の制御権を持っている必要があります。それが、サービス・ルーチンでtpreturn()
を介して会話を正常に終了します。この場合、Javaクライアントは、会話イベント「TPEV_SVCSUCC
」(あるいは「TPEV_SVCFAIL
」)でTPReplyException
を受信するはずです。
JATMI会話モデルは、TPReplyExcepton
を使用して会話イベントを搬送します。会話イベントをJavaクライアントに伝達する必要がある場合、Tuxedo JCA AdapterはTPReplyException
を送出します。
TPReplyException
は、Oracle Tuxedo会話型サーバーから戻されたデータを搬送することもできます。JavaクライアントがTPReplyException
を捕捉する場合、イベントとデータの両方を確認する必要があります。会話イベントには2つのタイプがあります。
TPEV_DISCONIMM
、TPEV_SVCSUCC
、TPEV_SVCERR
、TPEV_SVCFAIL
は会話完了ステータスを示すタイプです。これらの3つのイベントのいずれかが発生した場合、会話はすでに失効しています。会話オブジェクトは使用しないでください。TPEV_SENDONLY
は会話制御権の交代イベントのタイプです。このイベントが発生した場合、Javaクライアントが会話の制御権を再取得します。
イベントがない場合(データを伴っていてもいなくても)、tprecv()
は例外なしに正常に戻し操作を行います。接続、プロトコルおよび構成に関連するエラーが発生した場合、Tuxedo JCA AdapterによってTPException
が送出されます。前述の具体例では、Oracle Tuxedo会話サーバーはtpreturn
(TPSUCCESS
)を開始し、クライアントはtprecv()
を開始して、TPReplyException
.からTPEV_SVCSUCC
イベントを取得します。
新しいメソッド(Oracle Tuxedo会話型サーバーとの会話を開始するために使用されるtpconnect()
)が、com.oracle.tuxedo.adapter.cci.TuxedoInteraction
クラスに追加されました。この新しいATMI会話にアクセスするには、Connection.createInteraction()
からTuxedoInteraction
クラスに戻されたInteractionオブジェクトを型キャストして、JATMI会話機能拡張へのアクセス権を取得する必要があります。
リスト45に、TuxedoInteraction
クラスのtpconnect
インタフェース定義の例を示します。
…
import weblogic.wtc.jatmi.Conversation;
…
public Conversation tpconnect(String svcname, TypedBuffer data, int flags) throws TPException;
…
tpconnect()
のflagsフィールドにTPSENDONLY
またはTPRECVONLY
を指定する必要があります。リスト46
に示すように、この2つのフラグはweblogic.wtc.jatmi.ApplicationToMonitorInterfaceクラスで定義されます。
TPSENDONLY
コール側がデータの送信のみ行い、コール先のOracle Tuxedoサービスがデータの受信のみを行うように会話を初期設定する場合。
TPRECVONLY
コール側がデータの受信のみ行い、コール先のOracle Tuxedoサービスがデータの送信のみを行うように会話を初期設定する場合。
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import weblogic.wtc.jatmi.ApplicationToMonitorInterface;
import weblogic.wtc.jatmi.Conversation;
import weblogic.wtc.jatmi.Reply;
import com.oracle.tuxedo.adapter.cci.TuxedoInteraction;
try {
myTux = tcf.getConnection();
ix = (TuxedoInteraction)myTux.createInteraction();
myConversation = ix.tpconnect("CONVSVC", myData, ApplicationToMonitorInterface.TPSENDONLY);
}
Catch (TPException tpe) {
…
}
…
com.oracle.tuxedo.adapter.cci.TuxedoInteraction
クラスのtpconnect()
インタフェースは、weblogic.wtc.jatmi.Conversation
会話オブジェクトを戻します。戻された会話オブジェクトを使用して、Oracle Tuxedo会話型サーバーと会話できます。
リスト47に、インタフェース宣言の例を示します。
public void tpsend(TypedBuffer data, int flags) throws TPException;
public Reply tprecv(int flags) throws TPException, TPReplyException;
public void tpdiscon() throws TPException;
Public void tpsend(TypedBuffer data, int flags)
throws TPException
。このメソッドは、JavaクライアントからOracle Tuxedo会話型サーバーに、オープンな会話を介してデータを送信します。Javaクライアントが会話の制御権を持っている必要があります。Javaクライアントが不適切なコンテキストで(つまり会話制御権なしに)tpsend()
を開始すると、TPException.TPEPROTO
エラーを受信します。
エラーが発生するとTPException
が送出されます。TPExcepiton.gettperrno()
をコールすることによってエラー・コードを取得できます。次に、可能なTPException
エラーのリストを示します。
Public Reply tprecv(int flags)
throws TPException
, TPReplyException
。このメソッドは、Javaクライアントが、オープンな会話を介してOracle Tuxedo会話型サーバーで送信されるデータを受信するために使用します。このメソッド・コールは、Javaクライアントが会話制御権を持たない場合にのみ発行できます。Javaクライアントがこのメソッドを不適切にコールすると(つまり、まだ会話制御権がある場合)、TPException.TPEPROTO
例外が送出されます。状況の性質に応じて、このメソッドは、TPException
またはTPReplyException
のいずれかを送出できます。
ここでは通常、TPReplyException
を使用して、Oracle Tuxedo会話サーバーからのイベント(会話完了や会話制御権の交代など)を伝達します。ただし、データ受信時に予期しないエラーが発生したためにTPException
を送出することがあります(このメソッドを不適切にコールした、ネットワーク・エラーが発生したなど)。
会話にイベントが存在する場合、tprecv()
はTPERRNO
をTPException.TPEEVENT
に設定してTPReplyException
を戻します。イベント・タイプも戻されます。JavaクライアントはTPReplyException.getrevent()
を呼び出して、それを取得できます。次に、有効なイベントのリストを示します。
TPEV_SENDONLY
Oracle Tuxedo会話型サーバーが会話の制御権を放棄しました。Javaクライアントは、データを送信することはできますが、制御権を放棄するまではデータを受信することはできません。
TPEV_SVCERR
このイベントは、Oracle Tuxedo会話型サーバーがtpreturn()
を開始したが、tpreturn()
の際にエラーが発生して、正常にサービスを戻せなかったことを示します。このイベントの性質上、アプリケーションが定義したデータや戻りコードは返されません。 会話も無効になります。
TPEV_SVCFAIL
このイベントは、Oracle Tuxedo会話サーバーが、アプリケーションで定義されたとおり正常でない方法で完了したことを示します。tpreturn()
がTPFAIL
またはTPEXIT
でコールされました。tpreturn()
がコールされたときにOracle Tuxedo会話サーバーが会話制御権を持っていた場合、アプリケーション定義のリターン・コードと型付けされたバッファを渡すことができます。Javaクライアントがこのイベントを参照すると、会話は無効になります。
TPEV_SVCSUCC
このイベントは、Oracle Tuxedo会話型サーバーが、アプリケーションで定義されているように正常に会話を完了し、tpreturn()
をTPSUCCESS
でコールしたことを示します。Javaクライアントがこのイベントを受信すると、会話は無効です。
TPEV_DISCONIMM
このイベントは、会話の呼出し側が、tpdiscon()
を介して、即時接続切断を発行したことを示します。このイベントは、通信エラーにより接続が切断されたときにも起動元またはその従属側に返されます。Tuxedo JCA Adapterとの関係では、これはサーバーが会話制御権なしでtpreturn()
を開始したためである可能性もあります。TDOMAINプロトコルはそれをTPEV_DISCONIMM
イベントに変換します。これは即時切断通知の強制終了(つまり、正常ではない)であるため、処理途中のデータは失われます。この接続に使用された記述子は無効になります。
エラーが発生するとTPException
が送出されます。TPExcepiton.gettperrno()
をコールすることによってエラー・コードを取得できます。次に、可能なTPException
エラーのリストを示します。
Tuxedo JCA Adapterまたはリモート・アクセス・ポイントに問題が発生しました。Javaクライアント・コードは両方の例外型を捕捉し、それに応じて処理する必要があります。Javaクライアントの場合、会話は常にtprecv()
で終わります。この最後のtprecv()
は、Oracle Tuxedo会話サーバーのtpreturn()
に対応します。Javaクライアントが、ConnectionFactory.getConnection()
を介して取得したConnectionを使用して実行される場合、Connection.close()
をコールすることで、プールにConnectionを戻す必要があります。そうできない場合、Connectionリークを引き起こします。
public void tpdiscon()
throws TPException
;
tpdiscon()
メソッドは、会話オブジェクトによって表現された会話を即時破棄します。このメソッドをコールできるのは、会話の開始側(Javaクライアント)のみです。Java会話型クライアントはtpdiscon()
を使用して会話を破棄できますが、Oracle Tuxedo会話型サーバーを使用してtpreturn()
を使用する接続を破棄させる方が好都合です。それにより、確実に正しい結果が得られます。
Javaクライアントは、会話イベントの発生時にTPReplyException
を受け取ります。JavaクライアントはTPRecplyException.gettperrno()
をコールしてイベントが発生したかどうかを判断し、TPReplyException.getrevent()
を使用して会話イベントを取得する必要があります。
リスト48に、会話の制御権を放棄する場合の例を示します。
…
try {
myConversation.tpsend(myData, ApplicationToMonitorInterface.TPRECVONLY);
}
Catch (TPException tpe) {
…
}
…
…
try {
myConversation.tpsend(myData, ApplicationToMonitorInterface.TPRECVONLY);
}
Catch (TPException tpe) {
…
}
…
Tuxedo JCA AdapterのJava会話型クライアントは、tprecv()
のコール時に、TPReplyException
内部のTPEV_SENDONLY
イベントを受信すると、会話制御権を再取得できます。Javaクライアントは、戻されたTPERRNO
をチェックして、会話イベントが存在するかどうかを確認する必要があります。続いて、リスト49に示すようにイベントを取得します。
while (…) {
Try {
rply = myConversation.tprecv(0);
}
catch (TPReplyException tre) {
switch (tre.gettperrno()) {
case TPException.TPEEVENT:
switch (tre.getrevent()) {
case TPException.TPEV_SENDONLY:
…
Oracle Tuxedo会話型サーバーは、tprecv()
のコール時にTPEV_SENDONLY
イベントを受信すると、会話制御権を再取得できる可能性があります。tpsend()
をTPRECVONLY
でコールすると、会話の制御権を放棄することもできます。
try {
myRtn = myConversation.tprecv();
}
Catch (TPReplyException tre) {
Switch (tre.gettperrno()) {
Case TPException.TPEEVENT:
Switch (tre.getrevent() {
Case TPException.TPEV_SENDONLY:
/* got the control of the conversation */
…
}
…
}
会話をするのに必要な特別な構成はありません。しかし、正しく構成されたOracle Tuxedo会話サーバーがTUXCONFIG
で提示される必要があります。このサーバーはBDMCONFIG
によってサービスをエクスポートします。Tuxedo JCA Adapterの場合、デフォルトのImportが機能するように、Importを構成しないことを選択するか、インポートされたすべてのOracle Tuxedoサービス(会話サービスを含む)にImportを構成しておくことができます。
Oracle Tuxedoサーバーは、リスト51に示すように、会話型サーバーとして構成される必要があります。
*SERVERS
DEFAULT:
CLOPT="-A" RESTART=Y MAXGEN=5
Convserv SRVGRP=GROUP4 SRVID=41 CONV=Y
前述の例で、Oracle Tuxedoサーバー「Convserv
」は、「CONV=Y
」で設定された会話型サーバーです。
完全なOracle Tuxedo構成ファイルは、「サンプル会話アプリケーション」で提供されます。
会話サービスは、BDMCONFIGファイル内の構成を使用して、Tuxedo GWTDOMAINによってエクスポートされる必要があります。たとえば、「Convserv
」がサービス「CTOUPPER
」を提供している場合、「CTOUPPER
」はBDMCONFIG
ファイルを介してエクスポートされる必要があります。
*DM_LOCAL_SERVICES
CTOUPPER
Oracle Tuxedo Domainによってエクスポートされた同じサービスは、Tuxedo JCA Adapterによってインポートされる必要があります。2つの選択肢があります。
インポートされたリソースを一切構成しないことを選択すると、Tuxedo JCA Adapterのデフォルト・インポート機能が開始されます。この場合、Tuxedo JCA Adapterは、Javaクライアントによって要求された外部リソースが実際に存在するかどうかに関係なく、パートナのOracle Tuxedo Domainに、GWTDOMAINゲートウェイを介してサービス・リクエストを転送します。
インポートされたリソースを構成するよう選択すると、明示的に構成されている外部リソースをコールするサービス・リクエストのみが許可されます。構成されていない外部リソースを要求するサービス(通常はOracle Tuxedoサービス)はすべて拒否され、TPException.TPENOENT
エラーを送出します。
リスト52に、Tuxedo JCA Adapter dmconfig
ファイルのインポートされたリソースの例を示します。
…
<Import name="CTOUPPER">
<RemoteName>CTOUPPER</RemoteName>
<SessionName>session_1</SessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
…
リスト53に、非常に単純な完全なアプリケーションの例を示します。
これは、アプリケーションのOracle Tuxedo Conversationサーバー部分です。
Oracle Tuxedo Server Applicatiov/*
* Copyright (c) 2012 by Oracle. All Rights Reserved.
*/
#include <tmenv.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
#include <Uunix.h> /* TUXEDO Header File */
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
tpopen();
userlog("tpsvrinit(10) Welcome to the conversational simple server");
return(0);
}
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
MYCONV(TPSVCINFO *rqst)
#else
MYCONV(rqst)
TPSVCINFO *rqst;
#endif
{
long revent;
long the_len;
long ret;
long flags;
char* line = NULL;
userlog("> MYCONV()");
if ((line = tpalloc("STRING", "", 1024)) == (char *)NULL) {
userlog("< MYCONV(10) failed to allocate STRING buffer");
tpreturn(TPFAIL, 0, NULL, 0, 0);
}
the_len = rqst->len;
userlog("receive rqst->data %p, the len = %d", rqst->data, the_len);
if (rqst->data != NULL && the_len > 0) {
userlog("recv data #1: %s", rqst->data);
}
if (rqst->flags & TPSENDONLY) {
userlog("rqst->flags & TPSENDONLY");
goto send_data;
}
userlog("call tprecv()");
if (tprecv(rqst->cd, &rqst->data, &the_len, TPNOCHANGE, &revent) != -1) {
userlog("receive rqst->data %p, the len = %d", rqst->data, the_len);
if (rqst->data != NULL) {
userlog("recv data #2: %s", rqst->data);
}
}
/* check for event */
if ((tperrno == TPEEVENT) && (revent == TPEV_SENDONLY)) {
userlog("recv revent = TPEV_SENDONLY");
}
else {
/* this is not what I expected */
userlog("< MYCONV(20) invalid errno %d(%s) or event 0x%lx",
tperrno, tpstrerror(tperrno), revent);
tpreturn(TPFAIL, 1, rqst->data, rqst->len, 0);
}
userlog("1st tprecv() successful");
send_data:
userlog("start 1st tpsend()");
(void)strcpy(line, "return data #1");
revent = 0;
if (tpsend(rqst->cd, line, strlen(line)+1, 0, &revent) == -1) {
(void) userlog("MYCONV(20) tpsend error");
if(tperrno == TPEEVENT) {
userlog("< MYCONV(30) got event: 0x%lx", revent);
}
else {
userlog("< MYCONV(40) tperrno = %d (%s)",
tperrno, tpstrerror(tperrno));
}
/* this is not what I expected */
tpreturn(TPFAIL, 2, rqst->data, rqst->len, 0);
}
userlog("1st tpsend() successful");
userlog("< MYCONV() return(50) TPSUCCESS");
(void)strcpy(line, "my final data");
tpreturn(TPSUCCESS, 0, line, strlen(line) + 1, 0);
}
Oracle Tuxedo会話型サーバーと通常のサーバーの構築に違いはありません。前述のOracle Tuxedo会話型サーバーをビルドするには、次のコマンドを発行します。
buildserver -f convsimp.c -o convsimp -s MYCONV
リスト54に、Oracle Tuxedo構成ファイルの例を示します。
#Ubbconfig of Tuxedo Domain
#
*RESOURCES
IPCKEY 51301
MASTER site1
MAXACCESSERS 100
MAXSERVERS 25
MAXSERVICES 50
MODEL SHM
LDBAL N
BLOCKTIME 10
SCANUNIT 5
SECURITY NONE
*MACHINES
DEFAULT:
APPDIR="C:\test\JCA\tdom"
TUXCONFIG="C:\test\JCA\tdom/TUXCONFIG"
TUXDIR="c:\tuxedo\Tuxedo11gR1PS1"
"NEOCORTEX "LMID=site1
MAXWSCLIENTS=2
*GROUPS
GROUP1 LMID=site1 GRPNO=1 OPENINFO=NONE
GROUP2 LMID=site1 GRPNO=2 OPENINFO=NONE
GROUP3 LMID=site1 GRPNO=3 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A" RESTART=Y MAXGEN=5
DMADM SRVGRP=GROUP1 SRVID=21
GWADM SRVGRP=GROUP2 SRVID=31
GWTDOMAIN SRVGRP=GROUP2 SRVID=32
convsimp SRVGRP=GROUP3 SRVID=41 CONV=Y
*SERVICES
MYCONV
リスト55に、Oracle Tuxedo Domainの構成例を示します。
#
*DM_RESOURCES
#
VERSION=U22
#
#
#
*DM_LOCAL_DOMAINS
#
#
"TDOM" GWGRP=GROUP2
TYPE=TDOMAIN
DOMAINID="TDOM_ID"
BLOCKTIME=60
SECURITY=NONE
#
*DM_REMOTE_DOMAINS
#
#
JDOM TYPE=TDOMAIN
DOMAINID="JDOM_ID"
#
#
*DM_TDOMAIN
#
TDOM NWADDR="//localhost:12478"
JDOM NWADDR="//localhost:10801"
#
#
*DM_LOCAL_SERVICES
#
#Exported
#
MYCONV
#
*DM_REMOTE_SERVICES
#
#Imported
#
ここで、Javaクライアントは、Tuxedo JCA Adapter JATMI拡張機能を利用してOracle Tuxedo会話型サーバーと会話するJava Session Beanとして実装されています。ConnectionとInteractionは、処理が完了したら、会話が成功したかどうかに関係なく、Javaクライアントによってクローズされる必要があります。クローズできないとConnectionのリークが発生します。
リスト56に、WebLogic Server用のJATMIクライアントのコード例を示します。
package test.conv.convsimp;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ejb.CreateException;
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.Connection;
import javax.resource.cci.Interaction;
import javax.resource.cci.InteractionSpec;
import javax.resource.ResourceException;
import weblogic.ejb.GenericSessionBean;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import weblogic.wtc.jatmi.TypedString;
import weblogic.wtc.jatmi.TypedCArray;
import weblogic.wtc.jatmi.CallDescriptor;
import weblogic.wtc.jatmi.ApplicationToMonitorInterface;
import weblogic.wtc.jatmi.Conversation;
import weblogic.ejbgen.*;
/* the part with Tuxedo JCA Adapter */
import com.oracle.tuxedo.utils.TuxedoLogger;
import com.oracle.tuxedo.adapter.cci.TuxedoStringRecord;
import com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec;
import com.oracle.tuxedo.adapter.cci.TuxedoConnectionFactory;
import com.oracle.tuxedo.adapter.cci.TuxedoJCAConnection;
import com.oracle.tuxedo.adapter.cci.TuxedoInteraction;
/**
* TuxConversationBean is a stateful SessionBean. This EJBean illustrates:
* <ul>
* <li> The use of the Tuxedo JCA connector.
* <li> The use of Application-defined exceptions.
* <li> The use of JATMI conversational extension with Tuxedo Server.
* </ul>
*
* Copyright (c) 2012 by Oracle. All Rights Reserved.
*/
@FileGeneration(remoteClass = Constants.Bool.TRUE,
localHome = Constants.Bool.FALSE,
remoteHome = Constants.Bool.TRUE,
remoteClassName = "TuxConversation",
remoteHomeName = "TuxConversationHome",
localClass = Constants.Bool.FALSE)
@JarSettings(ejbClientJar = "convsimp_client.jar")
@JndiName(remote = "tuxedo.services.TuxConversationHome")
@Session(idleTimeoutSeconds = "600",
maxBeansInCache = "100",
transTimeoutSeconds = "0",
type = Session.SessionType.STATEFUL,
defaultTransaction = Constants.TransactionAttribute.SUPPORTS,
ejbName = "TuxConversation")
public class TuxConversationBean extends GenericSessionBean {
static final boolean VERBOSE = true;
/**
* This implementation
* will get the TuxedoConnectionFactory from JNDI, and use it to get
* an Oracle Tuxedo object, which can then be used to do the actual tpconnect.
* TypedString object.
* @param cmd A string to be used as command or first data item (not null)
* @param target A string to be used for that target name or send data itme. (not null)
* @return a string from server
*/
@RemoteMethod()
public String Conversation(String cmd, String target) throws TPException, TPReplyException
{
String ret = null;
try {
ret = doConversation(cmd, target);
}
catch (TPReplyException tre) {
log("TPReplyException: " + tre);
throw tre;
}
catch (TPException te) {
log("TPException: " + te);
throw te;
}
catch (Exception e) {
log("Exception: " + e);
throw new TPException(TPException.TPESVCFAIL, e.getMessage());
}
return ret;
}
private String doConversation(String cmd, String target) throws TPException, TPReplyException, Exception
{
Context ctx;
TuxedoConnectionFactory tcf;
TuxedoJCAConnection myTux;
TypedString myData = null;
TypedString returnData1 = null;
TypedString returnData2 = null;
Reply myRtn = null;
int flags;
Conversation myConversation;
TuxedoInteraction ix;
log("cmd: " + cmd + ", target: " + target);
try {
ctx = new InitialContext();
tcf = (TuxedoConnectionFactory)ctx.lookup("eis/TuxedoConnectionFactory");
}
catch (Exception ne) {
ne.printStackTrace();
log("eis/TuxedoConnectionFactory lookup failed");
throw new TPException(TPException.TPENOENT, "Could not get eis/TuxedoConnectionFactory:" +
ne.getMessage());
}
/*
* Get connection and interaction
*/
myTux = null;
ix = null;
try {
myTux = (TuxedoJCAConnection)tcf.getConnection();
ix = (TuxedoInteraction)myTux.createInteraction();
}
catch (ResourceException re) {
re.printStackTrace();
doClose(myTux, ix);
log("failed to create interaction");
throw new TPException(TPException.TPENOENT, "Could not create interaction:" +
re.getMessage());
}
myData = new TypedString(cmd);
if (cmd.equalsIgnoreCase("DoReceiveOnly")) {
flags = ApplicationToMonitorInterface.TPRECVONLY;
log( "set flags = TPRECVONLY");
}
else {
flags = ApplicationToMonitorInterface.TPSENDONLY;
log("set flags = TPSENDONLY");
}
/*
* Get Conversation object.
*/
try {
myConversation = ix.tpconnect("MYCONV", myData, flags);
}
catch (TPException te) {
doClose(myTux, ix);
te.printStackTrace();
log("get conversation object failure");
throw te;
}
catch (Exception ee) {
doClose(myTux, ix);
ee.printStackTrace();
log(" get conversation object failure");
throw new TPException(TPException.TPESYSTEM,
"failed to get conversation object: " + ee.getMessage());
}
log("tpconnect successful!");
/*
* first tpsend(), but 2nd data send.
*/
if (flags == ApplicationToMonitorInterface.TPSENDONLY) {
log("first tpsend()");
myData = new TypedString(target);
try {
myConversation.tpsend(myData, ApplicationToMonitorInterface.TPRECVONLY);
}
catch (TPException te) {
te.printStackTrace();
doClose(myTux, ix);
log("TPException: " + te);
throw te;
}
log("tpsend successful!");
}
/*
* tprecv() first part of data.
*/
try {
log("1 call tprecv()");
myRtn = myConversation.tprecv(0);
}
catch (TPReplyException tre) {
switch (tre.gettperrno()) {
case TPException.TPEEVENT: /* check for conversation event */
switch (tre.getrevent()) { /* handle according to type of event */
case TPException.TPEV_SENDONLY:
log("receive TPEV_SENDONLY");
/* not expecting change of direction */
doClose(myTux, ix);
log(" unexpected SENDONLY event: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected SENDONLY event:" + tre);
default:
// anything else in a RECEIVE state is an error
doClose(myTux, ix); /* needs to close connection */
log("unexpected event from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv event:" + tre);
} /* end of switch event type */
default:
doClose(myTux, ix); /* needs to close connection */
log("got unexpected error from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv exception:" + tre);
} /* end of switch tperrno type */
}
catch (TPException te) {
te.printStackTrace();
doClose(myTux, ix); /* needs to close connection */
log("tprecv threw TPException: " + te);
throw te;
}
catch (Exception ee) {
ee.printStackTrace();
doClose(myTux, ix);
log("tprecv threw Exception: " + ee);
throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
}
/*
* handles returned data
*/
returnData1 = (TypedString)myRtn.getReplyBuffer();
log("first receive successful!");
/*
*2nd tprecv(), server does a tpreturn()
*/
try {
log("2 call tprecv()");
myRtn = myConversation.tprecv(0);
}
catch (TPReplyException tre) {
switch (tre.gettperrno()) {
case TPException.TPEEVENT: /* check for conversation event */
switch (tre.getrevent()) { /* handle according to type of event */
case TPException.TPEV_SVCSUCC:
log("receive TPEV_SVCSUCC");
myRtn = tre.getExceptionReply();
break;
case TPException.TPEV_SVCFAIL:
doClose(myTux, ix); /* needs to close connection */
log("unexpected event from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv event TPEV_SVCFAIL:" + tre);
case TPException.TPEV_DISCONIMM:
doClose(myTux, ix); /* needs to close connection */
log("unexpected event from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv event TPEV_DISCONIMM:" + tre);
default:
// anything else in a RECEIVE state is an error
log("event = " + tre.getrevent());
doClose(myTux, ix);
log("unexpected event from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv event:" + tre);
} /* end of switch event type */
break;
default:
doClose(myTux, ix); /* needs to close connection */
log("got unexpected error from server: " + tre);
throw new TPException(TPException.TPESYSTEM,
"Unexpected tprecv exception:" + tre);
} /* end of switch tperrno type */
}
catch (TPException te) {
doClose(myTux, ix); /* needs to close connection */
te.printStackTrace();
log("tprecv threw TPException: " + te);
throw te;
}
catch (Exception ee) {
doClose(myTux, ix); /* needs to close connection */
ee.printStackTrace();
log("tprecv threw Exception: " + ee);
throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
}
returnData2 = (TypedString)myRtn.getReplyBuffer();
log("second receive successful!");
doClose(myTux, ix); /* needs to close connection even when everything is good */
log("conversation successful");
return returnData1.toString() + returnData2.toString();
}
private void doClose(Connection conn, Interaction ix)
{
try {
if (ix != null) {
ix.close();
ix = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
catch (Exception e) {
log("Exception occurred while closing connection! " + e.getMessage());
}
}
/**
* This method is required by the EJB Specification,
* but is not used by this example.
*/
public void ejbCreate() throws CreateException { }
public void ejbPostCreate() throws CreateException { }
private void log(String s) {
if (VERBOSE) {
System.out.println(s);
}
}
}
dmconfig
ファイルは、リスト57に示すように、構成ファイルがどこにあるかをTuxedo JCA Adapterに示すリソース・アダプタ・デプロイメント記述子のプロパティです。
<?xml version="1.0" encoding="UTF-8"?>
<TuxedoConnector>
<LocalAccessPoint name="JDOM">
<AccessPointId>JDOM_ID</AccessPointId>
<NetworkAddress>//localhost:10801</NetworkAddress>
</LocalAccessPoint>
<RemoteAccessPoint name="TDOM">
<AccessPointId>TDOM_ID</AccessPointId>
<NetworkAddress>//localhost:12478</NetworkAddress>
</RemoteAccessPoint>
<SessionProfile name="profile_1">
<BlockTime>60000</BlockTime>
<ConnectionPolicy>ON_STARTUP</ConnectionPolicy>
</SessionProfile>
<Session name="session_1">
<LocalAccessPointName>JDOM</LocalAccessPointName>
<RemoteAccessPointName>TDOM</RemoteAccessPointName>
<ProfileName>profile_1</ProfileName>
</Session>
<Import name="MYCONV">
<RemoteName>MYCONV</RemoteName>
<SessionName>session_1</SessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
</TuxedoConnector>
前述の構成例では、1つのローカル・アクセス・ポイント「JDOM
」と、1つのリモート・アクセス・ポイント「TDOM
」が構成されています。また「session_1
」という名前の、JDOM
とTDOM
の間の1つのOracle Tuxedo TDomainセッション、および「profile_1
」という名前のsession_1プロファイルも構成されています。
Oracle Tuxedoのエクスポートされたサービス名「MYCONV
」に対応して、「MYCONV
」という名前で構成された1つのインポートされたリソースが存在します。
リスト58に、対応するリソース・アダプタ・デプロイメント記述子を示します。このファイルは「ra.xml
」という名前で、Resource ArchiveファイルのMETA-INF
にあります。
<?xml version="1.0" encoding="UTF-8"?>
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<display-name>Tuxedo JCA Adapter</display-name>
<vendor-name>Oracle</vendor-name>
<eis-type>Tuxedo</eis-type>
<resourceadapter-version>12gR1(12.1.1.0.0)</resourceadapter-version>
<license>
<description>Tuxedo SALT license</description>
<license-required>false</license-required>
</license>
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</resourceadapter-class>
<!--
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoFBCResourceAdapter</resourceadapter-class>
The following is the list of properties name can be configured as adapter-wise configuration.
traceLevel - java.lang.String - a numerical value
xaAffinity - java.lang.String - transaction affinity to a remote domain, "true" or "false", default to true
keyFileName - java.lang.String - encryption key file name
throwFailureReplyException - java.lang.Boolean - default to ture
appManagedLocalTxTimeout - java.lang.Integer - Application managed transaction or AUTOTRAN timeout
defaults to 300 seconds
fieldTable16Class - java.lang.String - a comma-separated list of fully qualified FML classes
fieldTable32class - java.lang.String - a comma-separated list of fully qualified FML32 classes
viewFile16Class - java.lang.String - a comma-separated list of fully qualified VIEW classes
viewFile32Class - java.lang.String - a comma-separated list of fully qualified VIEW32 classes
tpusrFile - java.lang.String - path name to the TPUSR file
remoteMBEncoding - java.lang.String - remote Tuxedo encoding name for multi-byte language
mBEncodingMapFile - java.lang.String - path name to Multi-byte encoding name mapping
autoTran - java.lang.Boolean- enable adapter-wise AUTOTRAN, default to false
-->
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>C:\test\JCA\adapter\dmconfig.xml</config-property-value>
</config-property>
<config-property>
<config-property-name>debugConfig</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoManagedConnectionFactory</managedconnectionfactory-class>
<!--
The following is the list of properties that user can use them
to configure connection pool or connection factory.
User must either configure localAccessPointSpec or
connectionFactoryName if transaction is used.
These property described here is serving as template, user should not
configure them here, instead user should configure them either through WebSphere console
or weblogic-ra.xml side file.
-->
<config-property>
<description>factory-wise AUTOTRAN setting, default to false, overrides adapter-wise setting</description>
<config-property-name>autoTran</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise Failure Reply Exception setting, default to true, overrides adapter-wise setting</description>
<config-property-name>throwFailureReplyException</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application managed transaction or AUTOTRAN time out, overrides adapter-wise setting</description>
<config-property-name>appManagedLocalTxTimeout</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>connection factory or pool name, this is required if XA or local application managed
transaction is required</description>
<config-property-name>connectionFactoryName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>application password in either clear text or cipher text using com.oracle.tuxedo.tools.EncryptPassword tool</description>
<config-property-name>applicationPassword</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>local access point specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>localAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL to configure whether mutual authentication is required, default to false</description>
<config-property-name>mutualAuthenticationRequired</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL for configuring identity key store file name, must be configured if SSL is desired</description>
<config-property-name>identityKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL setting for private key alias used in the key store, must be configured if SSL is desired</description>
<config-property-name>privateKeyAlias</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise trusted key store file name, must be configured if SSL is desired</description>
<config-property-name>trustedKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for identityKeyStore in clear text</description>
<config-property-name>identityKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for privateKeyAlias in clear text</description>
<config-property-name>privateKeyAliasPassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for trustedKeyStore in clear text</description>
<config-property-name>trustedKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise RemoteAccessPoint specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>remoteAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise allow anonymous access to Tuxedo, default to false</description>
<config-property-name>rapAllowAnonymous</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key value for anonymous user, default to -1</description>
<config-property-name>rapDefaultApplicationKey</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key fully qualified class name for AppKey generator</description>
<config-property-name>rapApplicationKeyClass</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise custom application key parameter</description>
<config-property-name>rapApplicationKeyClassParam</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise session profile block timeout value, default to 60000 milliseconds</description>
<config-property-name>spBlockTime</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise whether allows interoperate with 6.5 Tuxedo Domain, default to false</description>
<config-property-name>spInteroperate</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise security setting, legal values: NONE, DM_PW, APP_PW</description>
<config-property-name>spSecurity</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise credential propagation policy, either LOCAL or GLOBAL</description>
<config-property-name>spCredentialPolicy</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise number of seconds that session waits between automatic connection establishment,
default to 60 seconds. A value of 0 disabled connection retry</description>
<config-property-name>spRetryInterval</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum number of times adapter will try to establish a session connection to
remote Tuxedo access point. Default value is Long.MAX_VALUE.</description>
<config-property-name>spMaxRetries</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise compression threshold, default to Integer.MAX_VALUE</description>
<config-property-name>spCompressionLimit</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise minimum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 0.</description>
<config-property-name>spMinEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 128.</description>
<config-property-name>spMaxEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise the maximum idle time before sending application level keep alive.
It is measured in millisecond, and roundup to seconds. Default value is 0.</description>
<config-property-name>spKeepAlive</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise how long adapter will wait for acknowledgement before adapter decides the
connection already lost. Measurement in millisecond, and its default value is 10 seconds.
A value of 0 will disable the wait, and thus will not close the connection</description>
<config-property-name>spKeepAliveWait</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise valid Tuxedo service names in a comma-separated list. If not specified then
default import will be used and will grant all service requests to remote Tuxedo domain</description>
<config-property-name>impResourceName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>Exported resources. Types of resource supported are</description>
<config-property-name>exportSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.resource.cci.Connection</connection-interface>
<connection-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoJCAConnection</connection-impl-class>
</connection-definition>
<!--
Other types of transaction support
<transaction-support>NoTransaction</transaction-support>
<transaction-support>LocalTransaction</transaction-support>
-->
<transaction-support>XATransaction</transaction-support>
<authentication-mechanism>
<authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
<credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
</authentication-mechanism>
<reauthentication-support>false</reauthentication-support>
</outbound-resourceadapter>
</resourceadapter>
</connector>
WebLogic Serverで実行されるTuxedo JCA Adapterを使用するには、JNDI
名に、固有の名前「weblogic-ra.xml
」を持つファイルを構成する必要があります。このファイルは、リスト59に示すように、Resource ArchiveのMETA-INF
に含まれている必要があります。
<?xml version="1.0"?>
<weblogic-connector
xmlns="http://www.bea.com/ns/weblogic/90">
<jndi-name>eis/TuxedoConnector</jndi-name>
<enable-access-outside-app>true</enable-access-outside-app>
<enable-global-access-to-classes>true</enable-global-access-to-classes>
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resource.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory</jndi-name>
</connection-instance>
</connection-definition-group>
</outbound-resource-adapter>
</weblogic-connector>
Tuxedo JCA Adapterには個別の.jar
ファイル形式で用意されたSOA構成ウィザードがあります。このウィザードはJDeveloper SOA拡張機能をサポートしています。このグラフィカルIDEを使用すると、Tuxedo JCA Adapterを介してOracle TuxedoでホストされるサービスをSOAアプリケーションで利用できます。Tuxedo JCA Adapterアイコンをドラッグ・アンド・ドロップしてOracle Tuxedoの「外部参照」を作成し、この構成ウィザードを使用してそのSOAの操作を構成することができます。
JATMIインタフェースにもCCIインタフェースにも変更はありませんが、JDeveloper SOA拡張機能ではJCA標準のCCIインタフェースのみを使用できます。Tuxedo JCA Adapterはインバウンド・サービス・リクエストをサポートしていますが、現時点でTuxedo JCA Adapter SOA構成ウィザードがサポートしているのはSOAのアウトバウンド操作のみです。
Tuxedo JCA Adapter SOA構成ウィザードは、Tuxedo JCA Adapterを介してOracle Tuxedoアプリケーションを使用するビジネス・ロジックを設計する際に、開発環境としてJDeveloperとSOA拡張機能を併用する場合に使用できます。JDeveloperのSOA拡張機能をインストールする必要があります。
Tuxedo JCA AdapterのSOA構成ウィザードを使用すると、各構成ページをナビゲートできます。これらのページには、「ようこそ」ページ、「サービス名」ページ、JNDI接続ファクトリ・ページ、「操作」ページ、Tuxedo JCA Adapterプロパティ・ページなどがあります。Tuxedo JCA Adapterプロパティ・ページには、com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec
のプロパティが含まれます。
コンポーネント名に「構成ウィザード」という名前が含まれていますが、このウィザードはJDeveloperでSOA拡張機能を構成し、Tuxedo JCA Adapterの起動方法をSOAに指示するためのものです。そのため、Tuxedo JCA Adapterの構成が必要になります。Tuxedo JCA AdapterがランタイムでSOAフレームワークを処理するように構成する場合、特別な構成は必要ありません。
既存のTuxedo JCA Adapterインストールは、構成に変更を加えなくても引き続き機能します。新規アプリケーションの場合は、3つの構成スタイルから1つを選択してTuxedo JCA Adapterを構成する必要があります。
リスト60に、SOA構成ファイル(soa-config.xml
)に構成されるTuxedo JCA Adapterの新しいタイプを示します。
<adapterType resourceBundle="com.oracle.tuxedo.adapter.designtime.resource.TuxedoJcaAdapterResourceBundle">
<name>${TJA_ADAPTER_COMPONENT_NAME_L}</name>
<bindingType>jca</bindingType>
<bindingSubType> tuxedo</bindingSubType>
<createType>referenceOnly</createType>
<implementationClass>com.oracle.tuxedo.adapter.designtime.TjaScaEndpointImpl</implementationClass>
<description>${TJA_ADAPTER_COMPONENT_DESC}</description>
<tooltip>${TJA_ADAPTER_COMPONENT_DESC}</tooltip>
<icon16x16>/com/oracle/tuxedo/adapter/designtime/resource/tja_adapter_16x16.png</icon16x16> <icon20x20>/com/oracle/tuxedo/adapter/designtime/resource/tja_adapter_20x20.png</icon20x20> <topSectionIcon>oracle/tip/tools/ide/fabric/resource/image/visuals_rd1/whiteServiceTop.png</topSectionIcon> <middleSectionIcon>oracle/tip/tools/ide/fabric/resource/image/visuals_rd1/whiteServiceMiddle.png</middleSectionIcon> <bottomSectionIcon>oracle/tip/tools/ide/fabric/resource/image/visuals_rd1/whiteServiceBottom.png</bottomSectionIcon> <collapsedSectionIcon>oracle/tip/tools/ide/fabric/resource/image/visuals_rd1/whiteServiceCollapsed.png</collapsedSectionIcon>
</adapterType>
前述の構成は実質的にダウンロードの一部として入手できるので、実際に変更する必要はありません。
SOA構成ファイルは$JDEVELOPER_HOME/integration/seed/soa/configuration
ディレクトリにあります。
Oracle JDeveloper IDEを起動するには、JDeveloperアイコンをダブルクリックするか、$JDEVELOPER_HOME/jdev/bin/jdev
を使用します。「コンポーネント」パレットのスライダを下にスクロールすると、Tuxedo JCA Adapterの「Oracle Tuxedo」アイコンが見つかります。図1は、SOA拡張機能によってTuxedo JCA Adapterが有効化されたJDeveloperのスクリーン・ショットを示しています。
以降では、Oracle TuxedoサービスTOUPPER
への「外部参照」の構成手順を、順を追って説明します。この外部参照は実行時にSOAフレームワークによって起動され、Tuxedo JCA Adapterを介してOracle Tuxedoサービスにアクセスします。
右側のパネルで「コンポーネント・パレット」を下にスクロールして「Tuxedo JCA Adapter」を見つけ、続いて、中央のウィンドウ・ペインにある「外部参照」領域に「Tuxedo JCA Adapter」アイコンをドラッグ・アンド・ドロップします。図2に示すように、Tuxedo JCA Adapter SOA構成ウィザードの「ようこそ」ページが表示されます。
「ようこそ」ページの「次へ」ボタンをクリックすると、図3に示すように、「サービス名」ページが表示されます。入力するサービス名は、Oracle Tuxedoのエクスポートされたサービス名と同じ名前でも、SOAアプリケーションに適した任意の名前でもかまいません。この「サービス名」はSOA参照で使用されます。
この例では、図4に示すように、「STRING_TOUPPER
」と入力します。
「サービス名」ページの「次へ」ボタンをクリックします。図5に示すように、接続ファクトリの情報ページが表示されます。接続ファクトリの情報ページでは、希望の接続ファクトリのJNDI
を指定し、使用するTuxedo JCA Adapter接続ファクトリを指定します。
使用する接続ファクトリのJNDI
名を入力します。この例では、デフォルトのJNDI名「eis/TuxedoConnectionFactory
」を使用します。
「次へ」ボタンをクリックします。図6に示すように、「アダプタ・インタフェース」ページが表示されます。アダプタ情報ページでは、WSDLを構成し、データ・バッファのXSDを指定します。
ほとんどの場合、「後で指定する操作とスキーマから定義」ボタンを選択すれば十分ですが、既存のWSDLをインポートすることもできます。
「次へ」ボタンをクリックすると、図7に示すように、「操作」ページが表示されます。Tuxedo JCA Adapter SOA構成ウィザードではアウトバウンド操作のみがサポートされているため、値は「アウトバウンド」のままにします。
「次へ」ボタンをクリックすると、図8に示すように、Oracle Tuxedoインタラクション・プロパティ・ページが表示されます。Tuxedo JCA Adapterでインポートされる実際のTuxedoサービス名を入力する必要があります。
この例では、インポートされるTuxedoサービス名は「STR_TOUPPER
」です。図9に示すように、Oracle Tuxedoサービスとして「STR_TOUPPER
」と入力します。
「次へ」ボタンをクリックすると、図10に示すように、Oracle Tuxedoリクエスト・バッファ・プロパティ・ページが表示されます。ターゲットOracle TuxedoサービスのTuxedo JCA Adapterインタラクション・リクエストのバッファ・タイプを指定します。
Oracle Tuxedoバッファ・タイプが構造体バッファ・タイプのいずれか(FML/FML32/VIEW/VIEW32/X_C_TYPE/X_COMMON
など)である場合、フィールド表ファイルまたはVIEW表定義ファイルから生成されるJavaクラスから対応するものを指定する必要があります。これらのクラスはTuxedo JCA Adapterに付属のツールを使用して生成できます。これらのクラスは、そのバッファに対してユーザーが定義したXSDと一致している必要があります。
この例では、図11に示すように、ドロップダウン・メニューから選択した「STRING」バッファ・タイプを使用します。
「次へ」ボタンをクリックすると、図12に示すように、Oracle Tuxedo応答バッファ・プロパティが表示されます。Oracle Tuxedoサービスから戻される可能性のあるTuxedo JCA Adapter Interaction応答バッファ・タイプをすべて選択します。
この例では、図13に示すように、応答バッファ・タイプとして「STRING」を選択します。
「次へ」ボタンをクリックすると、図14に示すように、「メッセージ」ページが表示されます。「メッセージ」の構成は、対応するスキーマを構成する際に使用します。スキーマ・ファイルの場所を指定し、アウトバウンド・メッセージを定義するスキーマ要素を選択する必要があります。
「メッセージ」ページは、応答が必要かどうかによって異なる場合があります。
図14は、応答が必要な場合の「メッセージ」構成ウィザード・ページを示しています。2つのスキーマ入力フィールドがある点に注意してください。1つは「インバウンド」というラベルのフィールドで、リクエスト・メッセージに必要なスキーマです。もう1つは「アウトバウンド」というラベルのフィールドで、応答メッセージに必要なスキーマです。
検索アイコンをクリックすると、図15に示すように、スキーマ・ファイルがインポートされます。
「OK」をクリックすると、図16に示すように、「ファイルのローカライズ」ページが表示されます。
図17に示すように、Stringバッファの要素が強調表示されます。
「OK」をクリックすると、図18に示すように、スキーマの「インバウンド」の部分が表示されます。
アウトバウンド・リクエストに対しても同じようにすると、「メッセージ」ページは図19のようになります。
図20は、応答が不要な場合(Tuxedoインタラクション・プロパティ・ページでTPNOREPLY
を選択した場合)の「メッセージ」構成ウィザード・ページを示しています。スキーマ入力フィールドは1つのみです。このフィールドはラベルのリクエスト・メッセージに必要な、メッセージ・スキーマというフィールドです。
「次へ」ボタンをクリックすると、図21に示すように、「終了」ページが表示されます。
「終了」ボタンをクリックすると、図22に示すように、Tuxedo JCA Adapter外部参照が作成されます。
Oracle Tuxedo FML表をweblogic.wtc.jatmi.mkfldclass
コンパイラへの入力として使用してクラスを生成すると、対応するクラスが生成されます。リスト81に示すように、XSDではXMLがタグ名「FML」を含む要素で囲まれていることを示す必要があります。
<ns:FML xmlns:ns="uri:my-namespace">
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</ns:FML>
対応するFMLスキーマをリスト82に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="FML">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Tuxedo FML32表をweblogic.wtc.jatmi.mkfldclass32
コンパイラへの入力として使用してクラスを生成すると、対応するクラスが生成されます。リスト83に示すように、XSDではそのXMLがタグ名「FML32」を含む要素で囲まれていることを示す必要があります。
<ns:FML32 xmlns:ns="uri:my-namespace">
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</ns:FML32>
対応するFMLスキーマをリスト84に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="FML32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Oracle Tuxedo VIEW定義ファイルをweblogic.wtc.jatmi.viewj
コンパイラへの入力として使用してクラスを生成すると、対応するクラスが生成されます。XSDではXMLが「VIEW
」という名前の要素タグで囲まれていることを示す必要があります。バッファ・サブタイプは、VIEW定義ファイルで定義される名前です。また、リスト85に示すように、実際のペイロードを囲むXMLタグ名として使用する必要があります。
<ns:VIEW xmlns:ns="uri:my-namespace">
<MyView>
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</MyView>
</ns:VIEW>
対応するVIEWスキーマをリスト86に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="VIEW">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="View16">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:short"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Oracle Tuxedo VIEW32定義ファイルをweblogic.wtc.jatmi.viewj32
コンパイラへの入力として使用してクラスを生成すると、対応するクラスが生成されます。XSDではXMLが「VIEW32
」という名前の要素タグで囲まれていることを示す必要があります。バッファ・サブタイプは、VIEW定義ファイルで定義される名前です。また、リスト87に示すように、実際のペイロードを囲むXMLタグ名として使用する必要があります。
<ns:VIEW32 xmlns:ns="uri:my-namespace">
<View32>
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</view32>
</ns:VIEW32>
対応するVIEW32スキーマをリスト88に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="VIEW32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="View32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:short"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema
Oracle Tuxedo VIEW定義ファイルをweblogic.wtc.jatmi.viewj
コンパイラへの入力として使用し、コマンドライン・オプション「-xctype
」を指定してクラスを生成すると、対応するクラスが生成されます。XSDではXMLが「X_C_TYPE
」という名前の要素タグで囲まれていることを示す必要があります。バッファ・サブタイプは、VIEW定義ファイルで定義される名前です。また、リスト89に示すように、実際のペイロードを囲むXMLタグ名として使用する必要があります。
<ns:X_C_TYPE xmlns:ns="uri:my-namespace">
<MyXCType>
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</MyXCType>
</ns:X_C_TYPE>
対応するX_C_TYPEスキーマをリスト88に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="X_C_TYPE">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyXCType">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:short"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Oracle Tuxedo VIEW定義ファイルをweblogic.wtc.jatmi.viewj
コンパイラへの入力として使用し、コマンドライン・オプション「-xcommon
」を指定してクラスを生成すると、対応するクラスが生成されます。XSDではXMLが「X_COMMON
」という名前の要素タグで囲まれていることを示す必要があります。バッファ・サブタイプは、VIEW定義ファイルで定義される名前です。また、リスト91に示すように、実際のペイロードを囲むXMLタグ名として使用する必要があります。
<ns:X_COMMON xmlns:ns="uri:my-namespace">
<MyXCommon>
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</MyXCommon>
</ns:X_COMMON>
「MyXCommon
」タグはX_COMMONバッファ・サブタイプです。
対応するX_C_TYPEスキーマをリスト92に示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="X_COMMON">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyXCommon">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
SOAは一般的にWSDLに基づいているため、どの「動詞」を使用するかはWSDL操作シグネチャで決まります。WSDLに対応するSYNC_SEND_RECEIVE
をリスト92に示します。
<operation name="ECHO">
<input message:="tns:send_msg"/>
<output message="tns:recv_msg"/>
</operation>
WSDLに対応するSYNC_SEND
をリスト94に示します。
<operation name="MYEVENT">
<input message:="tns:write_msg"/>
</operation>
"SYNC_RECEIVE"
はWSDL操作ではサポートされていません。
SOAフレームワークはXMLレコードによって操作されるため、Oracle Tuxedoのブロック指向バッファ・タイプとXMLレコード間で変換が必要になります。Tuxedo JCA Adapterは、この項で説明するルールとユーザーが構成したメタデータに従って暗黙的にバッファ変換を実行します。クライアントまたはSOAフレームワークでコーディングする必要はありません。
入力データとは、Tuxedo JCA AdapterがSOAフレームワークから受信するXMLレコードを意味し、サービス・リクエストとしてOracle Tuxedoに転送されます。表31に、SOAフレームワークからOracle Tuxedoに入力データを変換する場合のマトリックスを示します。
Oracle Tuxedoサービスの入力バッファ・タイプを指定しなかった場合、入力されるXMLレコードがXMLバッファで変換された後で、Oracle Tuxedoにリクエストが転送されます。
Oracle Tuxedoサービスで複数のOracle Tuxedoバッファ・タイプをサポートし、対応するSOAコンポジット・アプリケーションで複数のタイプのOracle Tuxedoバッファを使用してリクエストを生成する可能性がある場合、構成ウィザードを使用して、同じサービスを複数回構成する必要があります。これにより、SOAフレームワークでOracle Tuxedoサービスを起動する際に複数のTuxedoInteractionSpec
を使用できるようになります。
ターゲットOracle Tuxedoサービスで入力バッファ・タイプとしてFML/FML32が必要な場合、対応するFML/FML32クラスでリクエスト・クラスを構成する必要があります。この指定をしないと、構成ウィザードの次のページに進めません。実際に受け取った入力XMLレコードに、対応するFML/FML32のフィールド名が存在しないタグが含まれている場合、SOAフレームワークがTuxedo JCA Adapterを起動する際にResourceException
が送出されます。
注意: | VIEW、VIEW32、X_C_TYPEおよびX_COMMONにも同じ要件が適用されます。 |
出力データとは、Oracle Tuxedoサービスから戻される応答内のユーザー・データを意味します。この場合、Tuxedo JCA AdapterはOracle Tuxedoの型付きバッファに含まれるデータのみを受信できます。データはユーザーからの最小構成メタデータによってXMLレコードに変換されます。
Oracle Tuxedoサービスは、異なるOracle Tuxedo型付きバッファを使用してユーザー・データを戻す可能性があります。この場合、そのデータはTuxedo JCA Adapterによって暗黙的にXMLレコードに変換されるため、クライアント・コードを書く必要はありません。ただし、必要なメタデータを構成する責任があります。
表32に、Oracle TuxedoバッファからXMLレコードに出力データを変換する場合のマトリックスを示します。
応答バッファ・タイプが、VIEW、VIEW32、X_C_TYPE、X_COMMONのいずれかで、そのクラス名の対応するプロパティがTuxedoInteractionSpec
で構成されていない場合は、ResourceException
例外が送出されます。FML/FML32バッファ・タイプにも同じ要件が適用されます。
応答バッファ・タイプが、STRING、CARRAY、X_OCTET、MBSTRINGのいずれかで、適切なXMLタグが構成されていない場合は、ResourceException
例外が送出されます。
以降の項では、Tuxedo JCA Adapterによるバッファ・タイプ変換の仕組みについて説明します。
「変換なし」は、Tuxedo JCA Adapterがダイレクト・マッピングを使用して応答バッファを戻す、あるいはリクエストを受け取ることを意味します。応答XMLバッファに整形式XML文書が含まれていない場合は、ResourceException
が送出されます。
「タイプ1」の変換は、Tuxedo JCA AdapterがFLDIDを使用してFIELD NAMEを取得することを意味します。ALSB Tuxedoトランスポートによる処理と同様に、XML要素タグをリクエストと応答の両方で使用します。この場合、表33に示すように、FMLにはFMLのクラス名、FML32にはFML32のクラス名を構成する必要があります。
埋込みFML32は、Tuxedo JCA Adapterでもサポートされます。ただし、FML/FML32からXMLへの変換ではフィールド・タイプFLD_MBSTRINGはサポートされません。
リスト95に、FML32の表の例を示します。
#name number type flags comments
TEST_SHORT 108 short - -
TEST_STRING 109 string - -
パッケージ名tuxedo.test.datarecord.FML32
のweblogic.wtc.jatmi.mkfldclass32
への入力として前述のFML32表を使用すると、リスト96に示すように、Javaクラスが作成されます。
package tuxedo.test.datarecord.FML32;
import java.io.*;
import java.lang.*;
import java.util.*;
import weblogic.wtc.jatmi.*;
public final class fmltbl32
implements weblogic.wtc.jatmi.FldTbl
{
Hashtable nametofieldHashTable;
Hashtable fieldtonameHashTable;
/** number: 108 type: short */
public final static int TEST_SHORT = 108;
/** number: 109 type: string */
public final static int TEST_STRING = 167772269;
public String Fldid_to_name(int fldid)
{
if ( fieldtonameHashTable == null ) {
fieldtonameHashTable = new Hashtable();
fieldtonameHashTable.put(new Integer(TEST_SHORT), "TEST_SHORT");
fieldtonameHashTable.put(new Integer(TEST_STRING), "TEST_STRING");
}
return ((String)fieldtonameHashTable.get(new Integer(fldid)));
}
public int name_to_Fldid(String name)
{
if ( nametofieldHashTable == null ) {
nametofieldHashTable = new Hashtable();
nametofieldHashTable.put("TEST_SHORT", new Integer(TEST_SHORT));
nametofieldHashTable.put("TEST_STRING", new Integer(TEST_STRING));
}
Integer fld = (Integer)nametofieldHashTable.get(name);
if (fld == null) {
return (-1);
} else {
return (fld.intValue());
}
}
public String[] getFldNames()
{
String retval[] = new String[2];
retval[0] = new String("TEST_SHORT");
retval[1] = new String("TEST_STRING");
return retval;
}
}
リスト97は、FML32バッファから変換された後の状態を示しています。
<ns:FML32 xmlns:ns="uri:my-namespace">
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</ns:FML32>
リスト98に、対応するスキーマを示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="FML32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
注意: | このスキーマは、埋込みのVIEW32およびFML32を含むFML32を示しています。 |
リクエストまたは応答(あるいはその両方)のバッファ・タイプにVIEW、VIEW32、X_C_TYPEまたはX_COMMONを選択した場合、リスト34に示すように、Oracle Tuxedoバッファ・タイプに対応する完全修飾Javaクラスが必要になります。Javaクラス情報はテキスト入力フィールドで入力できます。
X_C_TYPEおよびX_COMMONはVIEWに似ているため、VIEWと同様に使用および作成できます。
完全修飾クラス・パスは、拡張されたTuxedoInteractionSpec
の一部になります。
対応するスキーマ・ファイルでXMLラッピング要素をラップしたように、サブタイプと同じ名前の要素を指定する必要があります。たとえば、サブタイプ名が「myview32
」の場合、対応するXML文書は、リスト99のようになります。
<VIEW32>
<myview32>
…
</myview32>
</VIEW32>
また、このVIEW32バッファ・タイプのXSDファイルは、リスト100に示すように定義できます。
<xsd:element name="VIEW32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="myview32">
<xsd:complexType>
…
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
ネストされたVIEWは、現在Tuxedo JCA Adapterでサポートされていません。
リスト101は、weblogic.wtc.jatmi.viewj32
で使用できるVIEW定義ファイルを示しています。
VIEW View32
short TEST_SHORT - 1 - - 0
string TEST_STRING - 1 - 100 -
END
リスト103に、viewj32コンパイラを使用して生成されたVIEW32クラス・ファイルを示します。
package tuxedo.test.datarecord.VIEW32;
import java.io.*;
import java.lang.*;
import weblogic.wtc.jatmi.*;
import com.bea.core.jatmi.common.Utilities;
public class View32 extends TypedView32 implements Serializable {
private short TEST_SHORT = 0;
private String TEST_STRING = null;
private boolean _associatedFieldHandling = false;
public View32() {
super("View32");
return;
}
/**
* Gets the current state of associated field handling.
* @return the current state (true=on, false=off)
*/
public boolean getAssociatedFieldHandling()
{
return _associatedFieldHandling;
}
/**
* Sets the state of associated field handling.
* @param state the desired state (true=on, false=off)
*/
public void setAssociatedFieldHandling(boolean state)
{
_associatedFieldHandling = state;
}
/**
* Gets the value of the TEST_SHORT element of this view
* @return The value which this element has
*/
public short getTEST_SHORT()
{
return(this.TEST_SHORT);
}
/**
* Sets the value of the TEST_SHORT element of this view
* @param value The value to set the element to
*/
public void setTEST_SHORT(short value)
{
this.TEST_SHORT = value;
}
/**
* Gets the value of the TEST_STRING element of this view
* @return The value which this element has
*/
public String getTEST_STRING()
{
return(this.TEST_STRING);
}
/**
* Sets the value of the TEST_STRING element of this view
* @param value The value to set the element to
* @throws IllegalArgumentException if the value is too long
*/
public void setTEST_STRING(String value)
{
if (value.length() > 100)
throw new IllegalArgumentException("Data too large for TEST_STRING");
this.TEST_STRING = value;
}
public void _tmpresend(DataOutputStream encoder)
throws TPException, IOException {
int lcv;
try {
encoder.writeInt(TEST_SHORT);
Utilities.xdr_encode_string_length(encoder,TEST_STRING, 100);
}
catch (IOException ie) {
System.out.println("Error encoding view buffer: " + ie);
}
return;
}
public void _tmpostrecv(DataInputStream decoder, int recv_size)
throws TPException, IOException {
int lcv;
TEST_SHORT = (short)decoder.readInt();
TEST_STRING = Utilities.xdr_decode_string(decoder, null);
return;
}
}
リスト103に、前述のVIEW32クラスを使用して生成された、対応するXML文書を示します。
<ns:VIEW32 xmlns:ns="uri:my-namespace">
<View32>
<TEST_SHORT>1234</TEST_SHORT>
<TEST_STRING>hello</TEST_STRING>
</View32>
</ns:VIEW32>
注意: | 「View32」タグはVIEWのサブタイプ(この場合、VIEW32という名前)を表すために挿入されています。 |
リスト104に、対応するスキーマを示します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="Uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="VIEW32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="View32">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TEST_SHORT" type="xsd:string"/>
<xsd:element name="TEST_STRING" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
「タイプ3」の変換は、STRING、CARRAY、MBSTRINGおよびX_OCTETのOracle Tuxedoバッファ・タイプで使用します。ラップされた操作を使用する必要があります。ラップされた操作では、XMLRecord
の応答をラップするために使用するタグ名を指定する必要があります。
XMLRecord
リクエスト・バッファのリクエストでは、レコードに複数の要素がある場合、実行時にResourceException
が送出されます。リクエストのXMLRecord
が空の場合や要素に長さ0の文字列が含まれている場合は、Oracle Tuxedoバッファ・タイプに対応する長さ0の文字列を使用してリクエストが転送されます。
応答バッファがCARRAYで、「attachment
」を指定した場合、CARRAYデータはXMLRecord
への添付になります。応答バッファがCARRAYで、ユーザーが「attachment
」を指定していない場合、応答データはXML文書として扱われます。
「MYSTRING
」という名前のXML要素タグを使用した「wrapped
」操作を選択した場合、応答は次のようにラップされます。
「wrapped
」操作を選択しなかった場合、Tuxedo JCA Adapterは応答をネイティブXML文書として扱い、これを使用してXMLRecord
を作成します。データが整形式XML文書でない場合は、ResourceException
が送出されます。
リスト105に、FML32バッファ・タイプ用のXSDファイルを示します。このファイルには、TEST_FML32
という名前の埋込みFML32フィールドと、TEST_VIEW32
という名前の埋込みView32フィールドがあります。TEST_VIEW32
VIEW32フィールドにはサブタイプmyview32
があります。
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
targetNamespace="uri:my-namespace"
xmlns="uri:my-namespace"
elementFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="FML32" type="MyBaseFML32Type"/>
<xsd:complexType name="MyBaseFML32Type">
<xsd:sequence>
<xsd:element name="TEST_CHAR" minOccurs="0" type="xsd:byte" />
<xsd:element name="TEST_STRING" minOccurs="0" type="xsd:string" />
<xsd:element name="TEST_SHORT" minOccurs="0" type="xsd:short" />
<xsd:element name="TEST_FML32" minOccurs="0" type="MyEmbeddedFML32Type" />
<xsd:element name="TEST_VIEW32" minOccurs="0" type="MyEmbeddedView32Type" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="MyEmbeddedFML32Type">
<xsd:sequence>
<xsd:element name="TEST_STRING" minOccurs="0" type="xsd:string"/>
<xsd:element name="TEST_SHORT" minOccurs="0" type="xsd:short"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="MyEmbeddedView32Type">
<xsd:sequence>
<!--
"myview32" is the VIEW32 class name, and subtype of VIEW32 buffer
A VIEW32 def file must be created and use it to create table
The definition must corresponds to myviewType
and a viewj32 must be used to generate the class
the compiled java class must be put in the system classpath
-->
<xsd:element name="myview32" minOccurs="0" type="myviewType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="myviewType">
<xsd:sequence>
<xsd:element name="V_CHAR" minOccurs="0" type="xsd:byte"/>
<xsd:element name="V_SHORT" minOccurs="0" type="xsd:short"/>
<xsd:element name="V_STRING" minOccurs="0" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>