![]() ![]() ![]() ![]() ![]() ![]() |
Oracle Tuxedo JCA Adapterは、標準のJEE Connector Architecture Common Client Interface (CCI)とOracle Tuxedo Java Application-To-Monitor Interface (JATMI)の両方をサポートします。どちらのインタフェースを使用しても、クライアント・アプリケーションが、リモートのOracle Tuxedoアプリケーション・ドメインにあるサービスにアクセスできるようになります。Oracle Tuxedo JCA Adapterは、透過ルーティングおよびロード・バランシングを内部的にサポートしています。リクエストは、同じサービスを提供する異なるリモートOracle Tuxedoアプリケーション・ドメインに、ロード・バランシングされてルーティングされます。
Oracle Tuxedo JCA Adapterアプリケーションの開発には、次の前提条件があります。
Oracle Tuxedo JCA Adapter用のアプリケーションの開発には、次の手順が必要です。
注意: | これらの手順はアプリケーション開発とは独立に実行できますが、クライアント・アプリケーションを実行する前に完了する必要があります。詳細は、『Oracle Tuxedo JCA Adapterユーザーズ・ガイド』を参照してください。 |
クライアント・アプリケーションが接続インスタンスを取得するには、JNDIツリーのOracle 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
ユーティリティは、構成ファイル・パスワードを暗号化するために使用されます。Oracle Tuxedo JCA Adapter構成ファイルの構文を確認し、すべての暗号化されていないパスワード要素を暗号化パスワードで置換します。必要に応じて、パスワードを暗号化/復号化するために使用されるキー・ファイルを生成することもできます。
詳細は、 『Oracle Tuxedo JCA Adapterコマンド・リファレンス』を参照してください。
クライアント・アプリケーションの場合、Oracle Tuxedo JCA Adapterは、必要な接続の作成、セッション認証、データの機密性、データ変換、ルーティング/ロード・バランシングおよびトランザクションの各プロセスを実装します。これにより、Oracle 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();
入出力バッファ型は、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.setRecordMane("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管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションのタイプは、Oracle 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
」)を作成します。
リスト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);
}
}
Oracle Tuxedo JCA Adapterは、CCIを使用する、ローカル管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションごとのタイムアウトを設定するために、トランザクションには、Oracle Tuxedo JCA Adapter固有の拡張機能が必要です。
VIEW32型付きバッファを使用する、同期的なCCIベースのTuxedo JCA Adapterローカル管理トランザクション・クライアント・プログラムを開発するには、次の手順を実行する必要があります。
この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPERで、構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER」サービスは、入出力にSTRING型付きバッファを必要とします。
リスト15に、Oracle Tuxedo接続(com.oracle.tuxedo.adapter.cci.TuxedoJCALocalTransaction
)から新しいOracle 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秒後にタイムアウトします。
注意: | これはOracle 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で、構成が必要です。詳細は、「構成ファイルの例」を参照してください。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);
}
}
Oracle Tuxedo JCA Adapterを使用して、EJBベースのTuxedoクライアント・サービスにアクセスできます。Oracle 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に示すようにOracle 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;
}
...
Oracle Tuxedo JCA Adapterを使用して、Plain Old Java Object (POJO)ベースのTuxedoクライアント・サービスにアクセスすることができます。
Oracle 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);
Oracle Tuxedo JCA Adapterが正常にPOJOサービスを起動するには、POJOデプロイメント記述子を構成する必要があります。リスト38に示すように、Oracle 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);
}
...
Oracle 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>
...
Oracle Tuxedo JCA Adapterを実行するには、次のファイルを構成する必要があります。
Oracle Tuxedo JCA Adapter構成ファイルは、正式な構文のXMLファイルです。このファイルの場所は、ra.xml
ファイルのリソース・アダプタ構成プロパティで構成されます。詳細は、 『Oracle JCAユーザーズ・ガイド』および『Oracle Tuxedo JCA Adapterリファレンス・ガイド』を参照してください。
リスト42に、構成ファイルをOracle 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に、次の項目にアクセスするOracle Tuxedo JCA Adapter DMCONFIGファイルの例を示します。
ローカル・アクセス・ポイントは、Oracle 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>11gR1PS1(11.1.1.2.0)</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>
アプリケーションを有効化するには、Oracle Tuxedo JCA Adapter構成ファイルを構成する以外に、Oracle Tuxedo UBBCONFIGおよびBDMCONFIG構成ファイルに、Oracle 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
![]() ![]() ![]() |