Oracle Tuxedo JCA Adapter (Tuxedo JCA Adapter)は、標準のJEE Connector Architecture Common Client Interface (CCI)とOracle Tuxedo Java Application-To-Monitor Interface (JATMI)の両方をサポートします。どちらのインタフェースを使用しても、クライアント・アプリケーションが、リモートのOracle Tuxedoアプリケーション・ドメインにあるサービスにアクセスできるようになります。Tuxedo JCA Adapterは、透過ルーティングおよびロード・バランシングを内部的にサポートしています。リクエストは、同じサービスを提供する異なるリモートOracle Tuxedoアプリケーション・ドメインに、ロード・バランシングされてルーティングされます。
Tuxedo JCA Adapterアプリケーションの開発には、次の前提条件があります。
Tuxedo JCA Adapter用のアプリケーションの開発には、次の手順が必要です。
注意: | これらの手順はアプリケーション開発とは独立に実行できますが、クライアント・アプリケーションを実行する前に完了する必要があります。詳細は、『Oracle Tuxedo JCA Adapterユーザーズ・ガイド』を参照してください。 |
クライアント・アプリケーションが接続インスタンスを取得するには、JNDIツリーのTuxedo JCA Adapterの接続ファクトリを参照する必要があります。正確な参照文字列は、構成によって異なる場合があります。
この情報をOracle JCA Adapterに提供するは、アプリケーション・サーバーによって異なる実装を使用できます。たとえば、Oracle WebLogicサーバーは、リスト1に示すようにweblogic-ra.xml
ファイルを使用してこの情報を提供します(<jndi-name>
XMLタグを使用)。
IBM WebSphereは、管理コンソールで、J2C接続ファクトリ
のページの「JNDI name」
フィールドを使用して、この情報を構成します。
<weblogic-connector
xmlns=http://www.bea.com/ns/weblogic/90>
<jndi-name>eis/TuxedoConnector</jndi-name>
...
<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>
リスト2に、接続ファクトリ参照と接続インスタンスのコード例を示します。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
...
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.Connection;
...
Context ctx;
ConnectionFactory cf;
Connection c;
...
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
...
ctx.lookup()
呼出しは、jndi-name
で構成されている文字列を使用します。
DMConfigChecker
ユーティリティは、構成ファイル・パスワードを暗号化するために使用されます。Tuxedo JCA Adapter構成ファイルの構文を確認し、すべての暗号化されていないパスワード要素を暗号化パスワードで置換します。必要に応じて、パスワードを暗号化/復号化するために使用されるキー・ファイルを生成することもできます。
詳細は、 『Oracle Tuxedo JCA Adapterコマンド・リファレンス』を参照してください。
クライアント・アプリケーションの場合、Tuxedo JCA Adapterは、必要な接続の作成、セッション認証、データの機密性、データ変換、ルーティング/ロード・バランシングおよびトランザクションの各プロセスを実装します。これにより、Tuxedo JCA AdapterクライアントによるOracle Tuxedoサービスへのアクセスが、より簡単で、整合的、透過的になります。
すべてのアプリケーション・サーバーが同じ方法でクライアント・プログラムを実行するわけではありません。独自のツールセットや実装方法論がある場合もあります。一般的に、クライアント・アプリケーションを開発した後に、次の手順に従ってクライアント・アプリケーション・サーバー・プログラムを実行する必要があります。
注意: | クライアント・アプリケーションを作成、構成、デプロイおよび実行する方法の詳細は、ターゲット・アプリケーション・サーバーのドキュメントを参照してください。 |
クライアント・アプリケーションは、JEEコネクタ・アーキテクチャCommon Client Interface (CCI)を使用してOracle Tuxedoサービスにアクセスすることができます。
CCIベースのTuxedo JCA Adapterクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。
この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名は「TOUPPER
」で構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER
」サービスは、入出力にSTRING型付きバッファを使用します。
新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。クライアント・アプリケーション(javax.resource.cci.Interaction
)とOracle Tuxedoサービスの間のインタラクションは、リスト3に示すようにインタラクション仕様(javax.resource.cci.InteractionSpec
)を使用してカスタマイズする必要があります。
Interaction ix;
TuxedoInteractionSpec ixspec;
...
ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();
Import
」セクションにあります)入出力バッファ型は、Oracle Tuxedoサービス・コードにアクセスするか、Oracle Tuxedoメタデータ・リポジトリを問い合わせる必要があります。詳細は、 Oracle Tuxedoメタデータ・リポジトリのドキュメントを参照してください。
リスト4に、同期的に「TOUPPER
」サービスを起動するクライアント・アプリケーションを示します。
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
送信される入力データは、Oracle Tuxedo型付きバッファを使用する必要があります。
リスト5に、入出力にSTRINGバッファ型を使用する「TOUPPER
」サービスを表示します。
TuxedoStringRecord inRec;
TuxedoStringRecord outRec;
...
inRec = new TuxedoStringRecord();
outRec = new TuxedoStringRecord();
inRec.setRecordName("MyInputData");
outRec.setRecordName("MyOutputData");
inRec.setString(string_to_convert)
リスト6に、実際の「TOUPPER
」サービス・リクエスト、リソース解放および応答データ取得を表示します。
ix.execute(ixspec, inRec, outRec);
ix.close();
c.close();
String returned_data = outRec.getString();
Javaコードをコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト7に、CCIクライアント・アプリケーション・プログラムの例を表示します。
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.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.cci.TuxedoStringRecord;
import com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec;
...
public String Toupper(String string_to_convert) throws TPException, TuxedoReplyException
{
Context ctx;
ConnectionFactory cf;
Connection c;
Interaction ix;
TuxedoStringRecord inRec;
TuxedoStringRecord outRec;
TuxedoInteractionSpec ixspec;
try {
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
ix = c.createInteraction();
ixspec = new TuxedoInteractionSpec();
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
inRec = new TuxedoStringRecord();
outRec = new TuxdeoStringRecord();
inRec.setRecordName("MyInputData");
outRec.setRecordName("MyOutputData");
outRec.setString(string_to_convert);
ix.execute(ixspec, inRec, outRec);
ix.close();
c.close();
String returned_data = outRec.getString();
return returned_data;
}
catch (NamingException ne) {
throw new TPException(TPException.TPESYSTEM,
"Could not get TuxedoConnectionFactory");
}
catch (ResourceException re) {
throw new TPException(TPException.TPESYSTEM,
"ResourceException occurred, reason: " + re);
}
}
Oracle JCA Adapterは、CCI管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションのタイプは、Tuxedo JCA Adapterデプロイメント記述子内で構成されているトランザクション・レベル(XAトランザクションかローカル・トランザクションか)に大幅に依存します。詳細は、 『Oracle Tuxedo JCA Adapterユーザーズ・ガイド』を参照してください。
VIEWバッファ型ベースの、CCI管理されたXAクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。
この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPER_V32
で、構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER_32
」サービスは、入出力にVIEW32型付きバッファを必要とします。
注意: | Tuxedo JCA AdapterでVIEW32型付きバッファに相当するのは、TuxedoView32Record です。次の例で、VIEW32ビューは、「View32 」と呼ばれています。Javaコードは、viewj32 コンパイラを使用して生成されます。 |
注意: | viewj およびviewj32 の情報についての詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「型付きバッファの管理」および 『Oracle Tuxedo JCA Adapterコマンド・リファレンス・ガイド』を参照してください。 |
リスト8に、VIEW32定義ファイルの例を示します。
VIEW View32
short TEST_SHORT - 1 - - 0
string TEST_STRING - 1 - 100 -
次のviewj32
ユーティリティ・コマンドを使用してコンパイルします。
java -classpath %CLASSPATH% weblogic.wtc.jatmi.viewj32 tuxedo.test.simapp View32
前述の例で、このコマンドは、現在の作業ディレクトリに「View32.java
」Javaクラス(パッケージ名「tuxedo.test.simpapp
」)を作成します。VIEW32ファイルに、ネストされたview32構造が含まれる場合、各ネスト・ビューに対応するJavaファイルが生成されます。
リスト9に、ユーザー・トランザクションを作成および開始する方法を表示します。トランザクションは、300秒後にタイムアウトします。
UserTransaction utx;
...
utx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
utx.setTransactionTimeout(300);
utx.begin();
新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。クライアント・アプリケーション(javax.resource.cci.Interaction
)とOracle Tuxedoサービスの間のインタラクションは、リスト10
に示すようにインタラクション仕様(javax.resource.cci.InteractionSpec)を使用してカスタマイズする必要があります。
Interaction ix;
TuxedoInteractionSpec ixspec;
...
ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();
入出力バッファ型は、Oracle Tuxedoサービス・コードにアクセスするか、Oracle Tuxedoメタデータ・リポジトリを問い合わせる必要があります。リポジトリ。詳細は、 Oracle Tuxedoメタデータ・リポジトリのドキュメントを参照してください。
リスト11に、非同期インタラクションを使用して「TOUPPER_32
」サービスを起動するクライアント・アプリケーションを示します。
ixspec.setFunctionName("TOUPPER_V32");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND);
Oracle Tuxedoに送信される入力データは、型付きバッファを使用する必要があります。
リスト12に、入出力にVIEW32型付きバッファを使用する「TOUPPER_32
」サービスを示します。
View32 myData;
TuxedoView32Record inRec;
...
myData = new View32();
myData.setTEST_SHORT((short)4);
myData.setTEST_STRING(string_to_convert);
inRec = new TuxedoView32Record(myData);
inRec.setRecordName("MyInputData");
リスト13に、実際の「TOUPPER_32
」サービス・リクエスト、リソース解放および応答データ取得を表示します。
TuxedoView32Record outRec;
...
ix.execute(ixspec, inRec);
ixspec.setInteractionVerb(InteractionSpec.SYNC_RECEIVE);
outRec = (TuxedoView32Record)ix.execute(ixspec, inRec);
utx.commit();
ix.close();
c.close();
View32 myDataBack = (View32)outRec.getView32();
String returned_data = myDataBack.getTEST_STRING();
Javaコードをコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト14に、トランザクション・クライアント・アプリケーション・プログラムの例を表示します。
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.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.cci.TuxedoView32Record;
import com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec;
import tuxedo.test.simpapp.View32;
...
private void cleanup(UserTransaction utx, Interaction ix, Connection c)
{
try {
if (utx != null) utx.rollback();
if (ix != null) ix.close();
if (c != null) c.close();
}
catch (Exception e) {
/* ignore */
}
}
public String Toupper(String string_to_convert) throws TPException, TuxedoReplyException
{
Context ctx;
ConnectionFactory cf;
Connection c;
UserTransaction utx;
View32 myData;
View32 myDataBack;
Interaction ix;
TuxedoView32Record inRec;
TuxedoView32Record outRec;
InteractionSpec ixspec;
try {
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
utx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
utx.setTransactionTimeout(300);
utx.begin();
ix = c.createInteraction();
ixspec = new TuxedoInteractionSpec();
ixspec.setFunctionName("TOUPPER_V32");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND);
myData = new View32();
myData.setTEST_SHORT((short)4);
myData.setTEST_STRING(string_to_convert);
inRec = new TuxedoView32Record(myData);
inRec.setRecordName("MyInputData");
ix.execute(ixspec, inRec);
ixspec.setInteractionVerb(InteractionSpec.SYNC_RECEIVE);
outRec = (TuxedoView32Record)ix.execute(ixspec, inRec);
utx.commit();
ix.close();
c.close();
myDataBack = (View32)outRec.getView32();
String returned_data = myDataBack.getTEST_STRING();
return returned_data;
}
catch (NamingException ne) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPESYSTEM,
"Could not get TuxedoConnectionFactory");
}
catch (ResourceException re) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPESYSTEM,
"ResourceException occurred, reason: " + re);
}
catch (javax.transaction.RollbackException rbe) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPETRAN, "Exception: " + rbe);
}
catch (javax.transaction.NotSuppotedException hre) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPETRAN, "Exception: " + nse);
}
catch (javax.transaction.HeuristicRollbackException hre) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPETRAN, "Exception: " + hre);
}
catch (javax.transaction.HeuristicMixException hme) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPETRAN, "Exception: " + hme);
}
catch (javax.transaction.SystemException se) {
cleanup(utx, ix, c);
throw new TPException(TPException.TPETRAN, "Exception: " + se);
}
}
Tuxedo JCA Adapterは、CCIを使用する、ローカル管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションごとのタイムアウトを設定するために、トランザクションには、Tuxedo JCA Adapter固有の拡張機能が必要です。
VIEW32型付きバッファを使用する、同期的なCCIベースのTuxedo JCA Adapterローカル管理トランザクション・クライアント・プログラムを開発するには、次の手順を実行する必要があります。
この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPER
で構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER
」サービスは、入出力にSTRING型付きバッファを必要とします。
リスト15に、Oracle Tuxedo接続(com.oracle.tuxedo.adapter.cci.TuxedoJCALocalTransaction
)から新しいTuxedo JCA Adapterのローカル・トランザクション・インスタンスを作成する方法を示します。
TuxedoJCALocalTransaction ltx;
...
ltx = (TuxedoJCALocalTransaction)c.getLocalTransaction();
新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。クライアント・アプリケーション(javax.resource.cci.Interaction
)とOracle Tuxedoサービスの間のインタラクションは、リスト16に示すようにインタラクション仕様(javax.resource.cci.InteractionSpec
)を使用してカスタマイズする必要があります。
Interaction ix;
TuxedoInteractionSpec ixspec;
...
ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();
リスト17に、管理されたローカル・トランザクションを作成して開始する方法を示します。トランザクションは、15秒後にタイムアウトします。
注意: | これはTuxedo JCA Adapter固有の実装で、標準CCIローカル・トランザクション・インタフェースの一部でありません。 |
ltx.begin(15);
入出力バッファ型は、Oracle Tuxedoサービス・コードにアクセスするか、Oracle Tuxedoメタデータ・リポジトリを問い合わせる必要があります。リポジトリ。詳細は、 Oracle Tuxedoメタデータ・リポジトリのドキュメントを参照してください。
リスト18に、同期的に「TOUPPER
」サービスを使用するクライアント・アプリケーションを示します。
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
Oracle Tuxedoに送信される入力データは、型付きバッファを使用する必要があります。
リスト19に、入出力にSTRING型付きバッファを使用する「TOUPPER
」サービスを示します。
TuxedoStringRecord inRec;
TuxedoStringRecord outRec;
...
inRec = new TuxedoStringRecord();
outRec = new TuxedoStringRecord();
inRec.setRecordName("MyInputData");
outRec.setRecordName("MyOutputData");
inRec.setString(string_to_convert);
リスト20に、実際の「TOUPPER
」サービス・リクエスト、リソース解放および応答データ取得を表示します。
ix.execute(ixspec, inRec, outRec);
if (outRec.getTperrno() == 0) {
ltx.commit();
}
else {
ltx.rollback();
}
ltx = null;
ix.close();
c.close();
String returned_data = outRec.getString();
Javaコードを正常にコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト21に、ローカル・トランザクション・クライアント・アプリケーション・プログラムの例を表示します。
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.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.cci.TuxedoView32Record;
import com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec;
import com.oracle.tuxedo.adapter.cci.TuxedoJCALocalTransaction;
...
public String Toupper(String string_to_convert) throws TPException, TuxedoReplyException
{
Context ctx;
ConnectionFactory cf;
Connection c = null;
TuxedoJCALocalTransaction ltx = null;
Interaction ix = null;
TuxedoStringRecord inRec;
TuxedoStringRecord outRec;
InteractionSpec ixspec;
try {
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
ltx = (TuxedoJCALocalTransaction)c.getLocalTransaction();
ix = c.createInteraction();
ixspec = new TuxedoInteractionSpec();
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
ltx.begin(15);
inRec = new TuxedoStringRecord();
outRec = new TuxedoStringRecord();
inRec.setRecordName("MyInputData");
outRec.setRecordName("MyOutputData");
inRec.setString(string_to_convert);
ix.execute(ixspec, inRec, outRec);
if (outRec.getTperrno() == 0) {
ltx.commit();
}
else {
ltx.rollback();
}
ix.close();
c.close();
String returned_data = outRec.getString();
return returned_data;
}
catch (NamingException ne) {
throw new TPException(TPException.TPESYSTEM,
"Could not get TuxedoConnectionFactory");
}
catch (ResourceException re) {
if (ltx != null) {
try {
ltx.rollback();
}
catch (ResourceException xre) {
/* ignore it */
}
}
try {
if (ix != null) ix.close();
if (c != null) c.close();
}
catch (Exception e) {
/* ignore it */
}
throw new TPException(TPException.TPESYSTEM,
"ResourceException occurred, reason: " + re);
}
}
クライアント・アプリケーションは、Java Application To Monitor Interface (JATMI)を使用してOracle Tuxedoサービスにアクセスすることができます。JATMIは、Oracle Tuxedo ATMIインタフェースの正しいJava実装です。
JATMIベースのTuxedo JCA Adapterクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。
この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPER
で構成が必要です。詳細は、「構成ファイルの例」を参照してください。Oracle Tuxedo TOUPPER
サービスは、入出力にSTRING型付きバッファを必要とします。
新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。JATMI対話処理機能拡張(com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec
)を使用する場合、クライアント・アプリケーションとOracle Tuxedoサービスの間の対話処理をカスタマイズするのに対話処理仕様は必要ありません。リスト22に示すように、JATMIサービス起動インタフェースは、これらの対話処理仕様をすでに含んでいます。
Interaction ix;
...
ix = c.reateInteraction()
入力データは、Oracle Tuxedo型付きバッファを使用して移動する必要があります。リスト23に、入出力にSTRING型付きバッファを使用する「TOUPPER
」サービスを示します。
TypedString inData;
...
inData = new TypedString(string_to_convert);
リスト24に、実際の「TOUPPER
」サービス・リクエストおよびデータ取得応答を表示します。
Reply myRtn;
TypedString outData;
myRtn = ix.tpcall("TOUPPER", inData, 0);
outData= (TypedString)myRtn.getReplyBuffer();
String returned_data = outData.toString()
リスト25に、リソースを解放する方法を表示します。
ix.tpterm();
c.close();
Javaコードをコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト26に、JATMIクライアント・アプリケーション・プログラムの例を表示します。
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.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TypedString;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.cci.TuxedoInteraction;
...
public String Toupper(String string_to_convert) throws TPException, TPReplyException
{
Context ctx;
ConnectionFactory cf;
Connection c;
Interaction ix;
TypedString inData;
TypedString outData;
Reply myRtn;
try {
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
ix = c.createInteraction();
inData = new TypedString(string_to_convert);
myRtn = ix.tpcall("TOUPPER", inData, 0);
outData= (TypedString)myRtn.getReplyBuffer();
String returned_data = outData.toString();
ix.tpterm();
c.close()
return returned_data;
}
catch (NamingException ne) {
throw new TPException(TPException.TPESYSTEM,
"Could not get TuxedoConnectionFactory");
}
catch (ResourceException re) {
throw new TPException(TPException.TPESYSTEM,
"ResourceException occurred, reason: " + re);
}
}
Tuxedo JCA Adapterを使用して、EJBベースのOracle Tuxedoクライアント・サービスにアクセスできます。Tuxedo JCA AdapterがEJBを起動するには、EJBはweblogic.wtc.jatmi.TuxedoService
インタフェースを使用する必要があります。このインタフェースは、リスト27に示すように、メソッドにより呼び出される単一のサービスを定義します。
public Reply service(TPServiceInformation svcinfo)
throws TPException, TPReplyException, RemoteException;
TuxedoService.service()
インタフェースを使用するEJBベース・サービス・アプリケーションを開発するには、次の手順を実行する必要があります。
このセクションのコード例は、次の作業を行う方法を示しています。
サービス名はTOLOWER
で構成が必要です。詳細は、「構成ファイルの例」を参照してください。EJBサービスは、入出力にSTRING型付きバッファを使用します。
リスト28に、TPServiceInformation
(リスト27参照)を使用して、入力データを取得する方法の例を示します。
TypedString data;
...
data = (TypedString)mydata.getServiceData();
リスト29に示すように、入力データが小文字に変換されます。
String lowered;
...
lowered = data.toString().toLowerCase();
出力データがある場合、Oracle Tuxedo型付きバッファでラップする必要があります。リスト30に、TypedString型付きバッファを使用して出力データをラップする方法を示します。
TypedString return_data;
...
return_data = new TypedString(lowered);
続いて、リスト31に示すように、型付き出力バッファが呼出し側にトランスポートされます(TPServiceInformation
オブジェクトを使用)。
mydata.setReplyBuffer(return_data);
Tuxedo JCA Adapterが正常にEJBサービスを起動するためには、EJBデプロイメント記述子が、次の情報を使用して構成されている必要があります。
必須の接頭辞(tuxedo.services
)とEJB名(TolowerHome
)は、リスト32に示すようにTuxedo JCA Adapter構成ファイルの<EXPORT>
<SOURCE>
要素内で構成されています。
<Export name="TOLOWER">
<RemoteName>TOLOWER</RemoteName>
<SessionName>session_1</SessionName>
<Type>EJB</Type>
<Source>tuxedo.services.TolowerHome</Source>
</Export>
Javaコードを正常にコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト33に、EJBクライアント・アプリケーション・プログラムの例を表示します。
package test.tuxedo.simpserv;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TypedString;
import weblogic.wtc.jatmi.Reply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
...
public Reply service(TPServiceInformation mydata) throws TPException
{
TypedString data;
String lowered;
TypedString returned_data;
data = (TypedString)mydata.getServiceData();
lowered = data.toString().toLowerCase();
returned_data = new TypedString(lowered);
mydata.setReplyBuffer(return_data);
return mydata;
}
...
Tuxedo JCA Adapterを使用して、Plain Old Java Object (POJO)ベースのOracle Tuxedoクライアント・サービスにアクセスすることができます。
Tuxedo JCA AdapterがPOJOサービスを起動するためには、POJOサービスが、エクスポートされた名前と同じ名前のメソッドを指定する必要があります。このメソッドは、TPServiceInformation
とTPRequestAsyncReply
の2つの固定した引数をとる必要があります。
TuxedoService.service()
インタフェースを使用するPOJOベース・サービス・アプリケーションを開発するには、次の手順を実行する必要があります。
このセクションのコード例は、次の作業を行う方法を示しています。
サービス名はMYTOLOWER
で構成が必要です。詳細は、「構成ファイルの例」を参照してください。POJOサービスは、入出力にSTRING型付きバッファを必要とします。
リスト34に、TPServiceInformation
(リスト27参照)を使用して、入力データを取得する方法の例を示します。
TypedString typedstr;
...
data = (TypedString)svcinfo.getServiceData();
リスト35に示すように、入力データが小文字に変換されます。
String lower;
...
lower = typedstr.toString().toLowerCase();
出力データがある場合、Oracle Tuxedo型付きバッファでラップする必要があります。リスト36に、TypedString型付きバッファを使用して出力データをラップする方法を示します。
TypedString return_data;
...
return_data = new TypedString(lower);
続いて、リスト31に示すように、型付き出力バッファが呼出し側にトランスポートされます(TPServiceInformation
オブジェクトを使用)。
mydata.setReplyBuffer(return_data);
areply.success(svcinfo);
Tuxedo JCA Adapterが正常にPOJOサービスを起動するには、POJOデプロイメント記述子を構成する必要があります。リスト38に示すように、Tuxedo JCA Adapter構成ファイルの<EXPORT>
セクションにPOJOメソッド名を構成する必要があります。
<SOURCE>
要素には完全修飾クラス名が含まれます。<SourceLocation>
要素には、クラスが含まれる.JAR
ファイルへのフル・パス名が含まれます。.JAR
ファイルは、CLASSPATHで構成される必要があります。
<Export name="TOLOWER_POJO">
<RemoteName>TOLOWER_POJO</RemoteName>
<SessionName>session_1</SessionName>
<Type>POJO</Type>
<Source>com.oracle.tuxedo.test.MyTolower</Source>
<SourceLocation>c:\tuxedo\jca\test\myapp.jar</SourceLocation>
</Export>
Javaコードを正常にコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。
リスト39に、POJOクライアント・アプリケーション・プログラムの例を表示します。
package com.oracle.tuxedo.test;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TypedString;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TPRequestAsyncReply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
...
public void TOLOWER_POJO(TPServiceInformation svcinfo, TPRequestAsyncReply areply) throws TPException
{
TypedString typedstr;
String lower;
TypedString returned_data;
typedstr = (TypedString)svcinfo.getServiceData();
lower = typedstr.toString().toLowerCase();
returned_data = new TypedString(lower);
svcinfo.setReplyBuffer(return_data);
areply.success(svcinfo);
}
...
Tuxedo JCA Adapterは、アダプタ管理されたAUTOTRANトランザクションをサポートしています。サービス・リクエストがまだ既存のトランザクションに含まれていない場合、AUTOTRANトランザクションのためにTuxedo JCA Adapterがトランザクションを開始します。Tuxedo JCA Adapterは、トランザクションをコミットまたはロールバックしてから、応答または例外をクライアント・プログラムに戻します。Tuxedo JCA Adapterがトランザクションをコミットするか、それともロールバックするかは、応答およびセッション接続ステータスに依存します。応答が障害またはセッション接続エラーを示すとトランザクションがロールバックされ、それ以外の場合は、トランザクションがコミットされます。
CCIベースの同期的Tuxedo JCA Adapter AUTOTRANクライアント・プログラムを開発する手順とプログラムは、「CCIクライアント・プログラミング」で説明している、トランザクションを伴わない普通のCCIベース同期クライアントを開発する場合とまったく同じです。唯一の相違は構成です。
リスト40に、インポートされたリソースTOUPPER
上でAUTOTRANを有効化する例を表示します。トランザクション・タイムアウトは15秒に設定されています。
....
<Import name="TOUPPER" autotran=true trantime=15>
<RemoteName>TOUPPER</RemoteName>
<SessionName>session_1</SessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
....
インポートされた個々のリソースに対してTuxedo JCA Adapter構成ファイルを使用してAUTOTRANを構成する以外に、リソース・アダプタ・デプロイメント記述子のプロパティを使用して、アダプタ全体でAUTOTRANを有効化することもできます。
リスト41に、トランザクション・タイムアウトを15秒に設定して、すべてのインポートされたリソース上でAUTOTRANを有効化する例を表示します。
...
<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>
<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>
...
Tuxedo JCA Adapterを実行するには、次のファイルを構成する必要があります。
Tuxedo JCA Adapter構成ファイルは、正式な構文のXMLファイルです。このファイルの場所は、ra.xml
ファイルのリソース・アダプタ構成プロパティで構成されます。詳細は、 『Oracle JCAユーザーズ・ガイド』および『Oracle Tuxedo JCA Adapterリファレンス・ガイド』を参照してください。
リスト42に、構成ファイルをTuxedo JCA Adapterにリンクするra.xml
ファイル・スニペットの例を示します。
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>c:/myJcaApp/adapter/bdmconfig.xml</config-property-value>
</config-property>
リスト43に、次の項目にアクセスするTuxedo JCA Adapter DMCONFIG
ファイルの例を示します。
ローカル・アクセス・ポイントは、Tuxedo JCA Adapterのリスニング・エンドポイントを定義します。リモート・アクセス・ポイントは、Oracle Tuxedo GWTDOMAINゲートウェイのリスニング・エンドポイントを定義します。
<?xml version="1.0" encoding="UTF-8"?><TuxedoConnector>
<Resources>
<ViewFile32Classes>tuxedo.test.simpapp.View32</ViewFile32Classes>
</Resources>
<LocalAccessPoint name="JDOM">
<AccessPointId>JDOM_ID</AccessPointId>
<NetworkAddress>//localhost:10801</NetworkAddress>
</LocalAccessPoint>
<RemoteAccessPoint name="TDOM1">
<AccessPointId>TDOM1_ID</AccessPointId>
<NetworkAddress>//localhost:12478</NetworkAddress>
</RemoteAccessPoint>
<SessionProfile name="profile_1">
<Security>NONE</Security>
<BlockTime>30000</BlockTime>
<Interoperate>false</Interoperate>
<ConnectionPolicy>ON_STARTUP</ConnectionPolicy>
<ACLPolicy>local</ACLPolicy>
<CredentialPolicy>local</CredentialPolicy>
<RetryInterval>60</RetryInterval>
<MaxRetries>1000</MaxRetries>
<CompressionLimit>1000000</CompressionLimit>
</SessionProfile>
<Session name="session_1">
<LocalAccessPointName>JDOM</LocalAccessPointName>
<RemoteAccessPointName>TDOM1</RemoteAccessPointName>
<ProfileName>profile_1</ProfileName>
</Session>
<Import name="TOUPPER">
<RemoteName>TOUPPER</RemoteName>
<SessionName>session_1</SessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
<Import name="TOUPPER_V32">
<RemoteName>TOUPPER_V32</RemoteName>
<SessionName>session_1</SessionName>
<LoadBalancing>RoundRobin</LoadBalancing>
</Import>
<Export name="TOLOWER">
<RemoteName>TOLOWER</RemoteName>
<SessionName>session_1</SessionName>
<Type>EJB</Type>
<Source>tuxedo.services.TolowerHome</Source>
</Export>
<Export name="TOLOWER_POJO">
<RemoteName>TOLOWER_POJO</RemoteName>
<SessionName>session_1</SessionName>
<Type>POJO</Type>
<Source>com.oracle.tuxedo.test.MyTolower</Source>
<SourceLocation>c:\tuxedo\jca\test\MyApp.jar</SourceLocation>
</Export>
</TuxedoConnector>
リスト44に、AUTOTRAN構成の例を示します。
<?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>12c(12.1.1)</resourceadapter-version>
<license>
<description>Tuxedo SALT license</description>
<license-required>false</license-required>
</license>
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.
TuxedoClientSideResourceAdapter</resourceadapter-class>
<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>appManagedLocalTxTimeout
</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>30</config-property-value>
</config-property>
<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>
<!--
Uncomment this if you are running Tuxedo version before 11.1.1.2.0
<config-property>
<config-property-name>localAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>//localhost:10801/domainId=JDOM_ID
</config-property-value>
</config-property>
-->
<config-property>
<config-property-name>viewFile32Classes</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>tuxedo.test.simpapp.View32
</config-property-value>
</config-property>
<config-property>
<config-property-name>remoteAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>//localhost:12478/domainId=TDOM1_ID
</config-property-value>
</config-property>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.Tu xedoManagedConnectionFactory</managedconnectionfactory-class>
<connectionfactory-interface>javax.resource.cci.ConnectionFactor
y</connectionfactory-interface>
<connectionfactory-impl-class>com.oracle.tuxedo.adapter.cci.Tuxe
doConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.resource.cci.Connection</connection- interface>
<connection-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoJCACo nnection</connection-impl-class>
</connection-definition>
<!--
<transaction-support>NoTransaction</transaction-support>
<transaction-support>LocalTransaction</transaction-support>
-->
<transaction-support>XATransaction</transaction-support>
<authentication-mechanism>
<authentication-mechanism-type>BasicPassword</authentication-mecha nism-type>
<credential-interface>javax.resource.spi.security.PasswordCredenti al</credential-interface>
</authentication-mechanism>
<reauthentication-support>false</reauthentication-support>
</outbound-resourceadapter>
</resourceadapter>
</connector>
リスト45に、AUTOTRANを有効化するプロパティの例を示します。
注意: | この構成は、WebSphere環境ではコンソールで行うこともできます。 |
<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>
アプリケーションを有効化するには、Tuxedo JCA Adapter構成ファイルを構成する以外に、Oracle Tuxedo UBBCONFIG
およびBDMCONFIG
構成ファイルに、Tuxedo JCA Adapterの構成を含める必要があります。
リスト46およびリスト47に、Oracle Tuxedoアプリケーション・ドメイン内部のサービスと、ドメイン間リクエストを公開するために必要な、UBBCONFIG
およびBDMCONFIG
ファイル・スニペットの例を示します。
*SERVICES
TOUPPER
TOUPPER_V32
...
*DM_LOCAL_SERVICES
TOUPPER
TOUPPER_V32
...
*DM_REMOTE_SERVICES
TOLOWER
TOLOWER_POJO
Tuxedo JCA Adapterでは、EJBアプリケーション・コードで実装する必要があるEJB MDBインタフェースが提供されます。
注意: | MDBインタフェースは、Tuxedo JCA Adapterによってサポートされる既存のEJBと類似していますが、同じではありません。 |
リスト48は、インタフェースのリストを示しています。
package com.oracle.tuxedo.adapter.intf;
import weblogic.wtc.jatmi.Reply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
public interface TuxedoMDBService {
public Reply service(TPServiceInformation service) throws TuxedoReplyException;
}
これはJMSベースのMDBとは異なり、onMessage()
インタフェースのかわりにservice()
インタフェースが使用されます。リスト49は、Oracle Tuxedoクライアント用の「Tolower」サービスを実装するMDBコードの例を示しています。
package ejbs;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.intf.TuxedoMDBService;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TypedString;
public class TolowerMDBBeanBean
implements MessageDrivenBean, TuxedoMDBService
{
public TolowerMDBBeanBean()
{
}
public MessageDrivenContext getMessageDrivenContext()
{
return fMessageDrivenCtx;
}
public void setMessageDrivenContext(MessageDrivenContext ctx)
{
fMessageDrivenCtx = ctx;
}
public void ejbCreate()
{
}
public void onMessage(Message message)
{
}
public void ejbRemove()
{
}
public Reply service(TPServiceInformation mydata)
throws TuxedoReplyException
{
TypedString data = (TypedString)mydata.getServiceData();
String lowered = data.toString().toLowerCase();
TypedString return_data = new TypedString(lowered);
mydata.setReplyBuffer(return_data);
return mydata;
}
private static final long serialVersionUID = 1L;
private MessageDrivenContext fMessageDrivenCtx;
}
この手順では、WebSphere ASTK 6.1を使用してコネクタ・ベースEJB 2.1 MDBを作成します。シンプルなEJB MDBは、入力文字列をOracle Tuxedoクライアントにエコー・バックします。プロジェクト名はEchoMDBです。
「J2EE」パースペクティブがまだない場合、次を実行して「J2EE」パースペクティブを変更します。
「ウィンドウ」メニューからパースペクティブを開く、J2EEの順に選択します。
「ファイル」メニューから、「新規」、「プロジェクト」の順に選択します。「EJB」をクリックして展開し、EJBプロジェクトをハイライトします。 「次へ」をクリックします。
「EJBプロジェクト」メニューで、「プロジェクト名」にEchoMDBと入力します。「次へ」をクリックします。「プロジェクト・ファセットの選択」メニューが表示されます。
「プロジェクト・ファセットの選択」メニューで、「EJBモジュール」のバージョンが「2.1」、「Java」」のバージョンが「5.0」、「WebSphere EJB」の拡張バージョンが「6.1」であるかを確認し、これら3つの項目が選択されているかを確認します。「次へ」をクリックします。
「EJBモジュール」メニューで、EJBクライアントのJARモジュールを作成してクライアント・インタフェースとクラスを保持するの選択を解除します。これは、インバウンドEJBがTuxedo JCA Adapterによって呼び出されるため不要になるからです。「終了」をクリックします。
「プロジェクト・エクスプローラ」で「EchoMDB」プロジェクトを右クリックします。コンテキスト・メニューから「プロパティ」を選択すると、図1に示すように「EchoMDBのプロパティ」ウィンドウが開きます。
Javaビルド・パスから「外部JARの選択...」を選択します。Tuxedo JCA AdapterのRARファイルから次の2つのJarファイルを追加します。(RARファイルを解凍していない場合は解凍します。)
com.bea.core.jatmi_1.3.2.0.jar
com.oracle.tuxedo.adapter_1.2.1.0.jar
プロジェクト・エクスプローラの左ウィンドウ・ペインで、新規作成したMDBプロジェクトのEchoMDBを展開します。EchoMDB右クリックし、「新規」を選択して、「その他」を選択します。エンタープライズBeanを選択し、「次へ」をクリックします。図2に示すように「エンタープライズBeanの作成」ポップアップ・ウィンドウが表示されます。
ポップアップ・ウィンドウで、「メッセージドリブンBean」を選択します。EchoMDBという値でBean名を入力します。
「次へ」をクリックします。図3に示すように、「メッセージドリブンBeanの種類」ポップアップ・ウィンドウが表示されます。その他の種類を選択し、「参照」をクリックします。TuxedoMDBServiceを入力し、図3のリストから選択して「OK」をクリックします。
「メッセージドリブンBeanの種類」ポップアップ・ウィンドウが表示されます。「終了」をクリックします。
EchoMDBBean.javaが表示されるまで、左ウィンドウ・ペインのejbModuleを展開します。ECHOサービスを実行するには、EchoMDBBean.javaを変更する必要があります。EchoMDBBean.javaをダブルクリックすると、図4に示すようにデフォルトのエディタと共に「編集」ウィンドウ・ペインが表示されます。
クラス・ファイルの最上段に、リスト1で示すように次の行を追加します。
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import weblogic.wtc.jatmi.TypedString;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.intf.TuxedoMDBService;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
リスト2
に示すように、クラス・ファイルの最後に記述されたservice()メソッドを編集します。
public weblogic.wtc.jatmi.Reply service(
com.oracle.tuxedo.adapter.tdom.TPServiceInformation mydata)
throws com.oracle.tuxedo.adapter.TuxedoReplyException {
TypedString data;
data = (TypedString)mydata.getServiceData();
mydata.setReplyBuffer(data);
return mydata;
}
「プロジェクト・エクスプローラ」でEchoMDBを右クリックし、図5に示すように「デプロイ」を選択します。これによって、ビルド・ディレクトリのクラスにコンパイルされます。
「プロジェクト・エクスプローラ」で「EchoMDB」プロジェクトを右クリックし、「エクスポート」を選択します。図6に示すように「エクスポート」ポップアップ・ウィンドウが表示されます。
「エクスポート」ポップアップ・ウィンドウで、EJB JARファイルを選択します。「次へ」をクリックします。図7に示すように「EJB Jarのエクスポート」ポップアップ・ウィンドウが表示されます。ドロップダウン・メニューからEchoMDBを選択し、JARファイルの完全パスを「宛先」テキスト・フィールドに入力します。「終了」をクリックします。
図8に示すように、「リソースの保存」ポップアップ・ウィンドウが表示されるので、「OK」をクリックします。
Tuxedo JCA Adapterのディスパッチ・ベースMDBの場合、2種類のうちいずれかの方法でactivation-config-property
をejb-jar.xml
ファイルに追加する必要があります。
META-INF/ejb-jar.xml
を変更してBeanのJARファイルを再JAR化します。 リスト1は、この種類のMDBに適したejb-jar.xml
サンプル・ファイルを示しています。<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" version="2.1" 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/ejb-jar_2_1.xsd">
<display-name>EchoMDB</display-name>
<enterprise-beans>
<!-- message driven descriptor -->
<message-driven id="EchoMDB">
<ejb-name>EchoMDB</ejb-name>
<ejb-class>ejbs.EchoMDBBean</ejb-class>
<!-- message listener interface -->
<messaging-type>com.oracle.tuxedo.adapter.intf.TuxedoMDBService</messag
ing-type>
<transaction-type>Container</transaction-type>
<!-- the values for the Activation Spec JavaBean -->
<activation-config>
<activation-config-property>
<activation-config-property-name>source</activation-config-property-name>
<activation-config-property-value>eis/echo</activation-config-property-value>
</activation-config-property>
</activation-config>
</message-driven>
</enterprise-beans>
</ejb-jar>
Java会話型クライアントがtpconnect()
コールを開始すると、Oracle TuxedoのC言語の会話型サーバー・サービス・ルーチンが起動されます。ただし、サービス・ルーチンが起動される前に、Oracle Tuxedoシステムが暗黙的にRECEIVE
コマンドを実装し、すべてのデータとイベントをサービス・ルーチンの入力引数に入れます。
Javaクライアントがtpconnect (TPSENDONLY)
を開始する場合、Oracle TuxedoサーバーではTPSVCINFO->data
およびTPSVCINFO->len
にデータが入ります。TPSENDONLY
フラグはTPRECVONLY
に変換され、TPSVCINFO->flags
フィールドに伝達されます。この場合、TPRECVONLY
フラグはサーバー・サービス・ルーチンによって無視されることがあるので、サーバーはTPEV_SENDONLY
イベントを受信するまでtprecv()
を開始し続けるようにします。
Javaクライアントがtpconnect(TPRECVONLY)
を開始すると、Oracle TuxedoサーバーではTPSVCINFO
にイベントとデータの両方が入ります。イベントはTPSVCINFO->flags
フィールドに、ユーザー・データはTPSCVINFO->data
、データ長はTPSVCINFO->len
にあります。サーバーは、tpreturn()
との対話を完了するか、tpsend(TPRECVONLY)
でクライアントにコントロールを戻すまで、tpsend()
の開始を開始するようにします。
警告: | データを送信しないように選択することもできます。この場合、TPSVCINFO->data はNULLです。 |
Oracle Tuxedoの、tpconnect()
を処理する一般的な会話型サーバー・コード例を次に示します。
void
CONV_TOUPPER(TPSVCINFO rqst)
{
if (rqst->data != NULL && rqst->len > 0) {
/* received meaningful data from client's tpconnect(). */
…
}
If (rqst->flags & TPSENDONLY) {
/* client does a tpconnect(TPRECVONLY) so server can start sending data immediately */
…
}
else {
/* client does a tpconnect(TPSENDONLY) so server just have to tprecv() until it gains control */
}
…
}
クライアントがデータを持たず、フラグのみを持つtpconnect()
を開始することは許容されます。サーバーは、サービス・ルーチンが起動されるときにデータを受信しない可能性を想定する必要があります。