プログラミング・ガイド

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

Oracle Tuxedo JCA Adapterプログラミング・ガイド

この章の内容は以下のとおりです。

 


概要

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用のアプリケーションの開発には、次の手順が必要です。

  1. 必要なリモートのOracle Tuxedoリソースを特定します。
  2. リソース・デプロイメント記述子を構成します。
  3. Oracle Tuxedo JCA Adapterを構成します。
  4. リソース・アーカイブを作成します。
  5. 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」フィールドを使用して、この情報を構成します。

リスト1 Oracle WebLogicサーバー・コネクタ
<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に、接続ファクトリ参照と接続インスタンスのコード例を示します。

リスト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ユーティリティの使用

DMConfigCheckerユーティリティは、構成ファイル・パスワードを暗号化するために使用されます。Oracle Tuxedo JCA Adapter構成ファイルの構文を確認し、すべての暗号化されていないパスワード要素を暗号化パスワードで置換します。必要に応じて、パスワードを暗号化/復号化するために使用されるキー・ファイルを生成することもできます。

詳細は、 『Oracle Tuxedo JCA Adapterコマンド・リファレンス』を参照してください。

 


Oracle Tuxedo JCA Adapterクライアント・アプリケーションの開発

クライアント・アプリケーションの場合、Oracle Tuxedo JCA Adapterは、必要な接続の作成、セッション認証、データの機密性、データ変換、ルーティング/ロード・バランシングおよびトランザクションの各プロセスを実装します。これにより、Oracle Tuxedo JCA AdapterクライアントによるOracle Tuxedoサービスへのアクセスが、より簡単で、整合的、透過的になります。

すべてのアプリケーション・サーバーが同じ方法でクライアント・プログラムを実行するわけではありません。独自のツールセットや実装方法論がある場合もあります。一般的に、クライアント・アプリケーションを開発した後に、次の手順に従ってクライアント・アプリケーション・サーバー・プログラムを実行する必要があります。

  1. クライアント・アプリケーションをビルドします。
  2. クライアント・アプリケーションを構成します。
  3. クライアント・アプリケーションをデプロイします。
  4. クライアント・アプリケーションを実行します。
注意: クライアント・アプリケーションを作成、構成、デプロイおよび実行する方法の詳細は、ターゲット・アプリケーション・サーバーのドキュメントを参照してください。

この節には、以下のトピックが含まれています。

CCIクライアントのプログラミング

クライアント・アプリケーションは、JEEコネクタ・アーキテクチャCommon Client Interface (CCI)を使用してOracle Tuxedoサービスにアクセスすることができます。

CCIベースのTuxedo JCA Adapterクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。

  1. 新しいインタラクションおよび仕様インスタンスを作成します。
  2. インポートされたOracle Tuxedoサービス名および呼出しを設定します。
  3. 新しいOracle Tuxedo型付きバッファのデータ・レコード・インスタンスを作成して入力します。
  4. サービス・リクエストを実行します。
  5. リソースを解放します。
  6. データ・レコードの出力応答を取得します。

この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名は「TOUPPER」で構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER」サービスは、入出力にSTRING型付きバッファを使用します。

新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。クライアント・アプリケーション(javax.resource.cci.Interaction)とOracle Tuxedoサービスの間のインタラクションは、リスト3に示すようにインタラクション仕様(javax.resource.cci.InteractionSpec)を使用してカスタマイズする必要があります。

リスト3 新しいインタラクション・インスタンスと仕様の作成
Interaction                     ix;
TuxedoInteractionSpec ixspec;

...

ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();

次をインポートする必要があります。

リスト4に、同期的に「TOUPPER」サービスを起動するクライアント・アプリケーションを示します。

リスト4 TOUPPERサービスを起動するCCIクライアント・アプリケーション
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);

送信される入力データは、Oracle Tuxedo型付きバッファを使用する必要があります。

リスト5に、入出力にSTRINGバッファ型を使用する「TOUPPER」サービスを表示します。

リスト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」サービス・リクエスト、リソース解放および応答データ取得を表示します。

リスト6 サービス・リクエスト、リソース解放および出力データ取得
ix.execute(ixspec, inRec, outRec);

ix.close();
c.close();

String returned_data = outRec.getString();

Javaコードをコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。

リスト7に、CCIクライアント・アプリケーション・プログラムの例を表示します。

リスト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ユーザーズ・ガイド』を参照してください。

CCI管理されたXAクライアントのプログラミング

VIEWバッファ型ベースの、CCI管理されたXAクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。

  1. viewj32コンパイラを使用してVIEW定義をコンパイルします。
  2. ユーザー・トランザクションを取得し、トランザクション・タイムアウトを設定して、トランザクションを開始します。
  3. 新しいインタラクションおよび仕様インスタンスを作成します。
  4. インポートされたOracle Tuxedoサービス名を設定します。
  5. 呼出しのスタイルを設定します。
  6. VIEW32オブジェクトをインスタンス化して初期化します。
  7. 新しいOracle Tuxedo型付きバッファのデータ・レコード・インスタンスを作成します。
  8. サービス・リクエストを実行します。
  9. 応答を取得します。
  10. トランザクションをコミットします。
  11. リソースを解放します。
  12. 出力データ・レコードの応答を取得します。

この項のコード例は、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定義ファイルの例を示します。

リスト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秒後にタイムアウトします。

リスト9 ユーザー・トランザクションの作成と開始
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)を使用してカスタマイズする必要があります。

リスト10 新しいインタラクション・インスタンスと仕様の作成
Interaction                     ix;
TuxedoInteractionSpec ixspec;

...

ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();

次をインポートする必要があります。

リスト11に、非同期インタラクションを使用して「TOUPPER_32」サービスを起動するクライアント・アプリケーションを示します。

リスト11 TOUPPERサービスを起動するCCIトランザクション・クライアント・アプリケーション
ixspec.setFunctionName("TOUPPER_V32");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND);

Oracle Tuxedoに送信される入力データは、型付きバッファを使用する必要があります。

リスト12に、入出力にVIEW32型付きバッファを使用する「TOUPPER_32」サービスを示します。

リスト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」サービス・リクエスト、リソース解放および応答データ取得を表示します。

リスト13 サービス・リクエスト、リソース解放および出力データ取得
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に、トランザクション・クライアント・アプリケーション・プログラムの例を表示します。

リスト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);
  }
}

CCI管理されたローカル・トランザクション・プログラミング

Oracle Tuxedo JCA Adapterは、CCIを使用する、ローカル管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションごとのタイムアウトを設定するために、トランザクションには、Oracle Tuxedo JCA Adapter固有の拡張機能が必要です。

VIEW32型付きバッファを使用する、同期的なCCIベースのTuxedo JCA Adapterローカル管理トランザクション・クライアント・プログラムを開発するには、次の手順を実行する必要があります。

  1. 新しいローカル・トランザクション・インスタンスを作成します。
  2. 新しいインタラクションおよび仕様インスタンスを作成します。
  3. インポートされたOracle Tuxedoサービス名を設定します。
  4. 呼出しスタイルを設定します。
  5. ローカル・トランザクションを開始します。
  6. 新しいOracle Tuxedo型付きバッファのデータ・レコード・インスタンスを作成します。
  7. 入力データをデータ・レコードに送信します。
  8. サービス・リクエストを実行します。
  9. ローカル・トランザクションをコミットします。
  10. リソースを解放します。
  11. 出力データ・レコードの応答を取得します。

この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPERで、構成が必要です。詳細は、「構成ファイルの例」を参照してください。「TOUPPER」サービスは、入出力にSTRING型付きバッファを必要とします。

リスト15に、Oracle Tuxedo接続(com.oracle.tuxedo.adapter.cci.TuxedoJCALocalTransaction)から新しいOracle Tuxedo JCA Adapterのローカル・トランザクション・インスタンスを作成する方法を示します。

リスト15 新しいローカル・トランザクション・インスタンスの作成
TuxedoJCALocalTransaction ltx;

...

ltx = (TuxedoJCALocalTransaction)c.getLocalTransaction();

新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。クライアント・アプリケーション(javax.resource.cci.Interaction)とOracle Tuxedoサービスの間のインタラクションは、リスト16に示すようにインタラクション仕様(javax.resource.cci.InteractionSpec)を使用してカスタマイズする必要があります。

リスト16 新しいインタラクションおよび仕様の作成
Interaction                     ix;
TuxedoInteractionSpec ixspec;

...

ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();

リスト17に、管理されたローカル・トランザクションを作成して開始する方法を示します。トランザクションは、15秒後にタイムアウトします。

注意: これはOracle Tuxedo JCA Adapter固有の実装で、標準CCIローカル・トランザクション・インタフェースの一部でありません。
リスト17 ローカル・トランザクションの作成と開始
ltx.begin(15);

次をインポートする必要があります。

リスト18に、同期的に「TOUPPER」サービスを使用するクライアント・アプリケーションを示します。

リスト18 TOUPPERサービスを起動するローカル・トランザクション・クライアント・アプリケーション
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);

Oracle Tuxedoに送信される入力データは、型付きバッファを使用する必要があります。

リスト19に、入出力にSTRING型付きバッファを使用する「TOUPPER」サービスを示します。

リスト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」サービス・リクエスト、リソース解放および応答データ取得を表示します。

リスト20 サービス・リクエスト、リソース解放および出力データ取得
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に、ローカル・トランザクション・クライアント・アプリケーション・プログラムの例を表示します。

リスト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);
  }
}

JATMIクライアントのプログラミング

クライアント・アプリケーションは、Java Application To Monitor Interface (JATMI)を使用してOracle Tuxedoサービスにアクセスすることができます。JATMIは、Oracle Tuxedo ATMIインタフェースの正しいJava実装です。

JATMIベースのTuxedo JCA Adapterクライアント・アプリケーションを開発するには、次の手順を実行する必要があります。

  1. 新しいインタラクション・インスタンスを作成します。
  2. 新しいJATMI型付きバッファのデータ・レコード・インスタンスを作成して入力します。
  3. Oracle Tuxedoサービスを呼び出します
  4. 出力データ・レコードの応答を取得します。
  5. リソースを解放します。

この項のコード例は、Oracle Tuxedoサービスに対してサービス呼出しを実行します。サービス名はTOUPPERで、構成が必要です。詳細は、「構成ファイルの例」を参照してください。Tuxedo TOUPPERサービスは、入出力にSTRING型付きバッファを必要とします。

新しいインタラクション・インスタンスを作成するには、クライアント・アプリケーションが接続への呼出しを行う必要があります。JATMI対話処理機能拡張(com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec)を使用する場合、クライアント・アプリケーションとOracle Tuxedoサービスの間の対話処理をカスタマイズするのに対話処理仕様は必要ありません。リスト22に示すように、JATMIサービス起動インタフェースは、これらの対話処理仕様をすでに含んでいます。

リスト22 新しいJATMI対話処理インスタンス
Interaction                     ix;

...

ix = c.reateInteraction()

入力データは、Oracle Tuxedo型付きバッファを使用して移動する必要があります。リスト23に、入出力にSTRING型付きバッファを使用する「TOUPPER」サービスを示します。

リスト23 STRINGバッファ型を使用するTOUPPERサービス
TypedString inData;

...

inData = new TypedString(string_to_convert);

リスト24に、実際の「TOUPPER」サービス・リクエストおよびデータ取得応答を表示します。

リスト24 JATMIクライアント・アプリケーションTOUPPERサービス・リクエストおよび出力データ取得
Reply           myRtn;
TypedString outData;

myRtn = ix.tpcall("TOUPPER", inData, 0);
outData= (TypedString)myRtn.getReplyBuffer();
String returned_data = outData.toString()

リスト25に、リソースを解放する方法を表示します。

リスト25 JATMIクライアント・アプリケーションのリソース解放
ix.tpterm();
c.close();

Javaコードをコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。

リスト26に、JATMIクライアント・アプリケーション・プログラムの例を表示します。

リスト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);
  }
}

インバウンドEJBサービスのプログラミング

Oracle Tuxedo JCA Adapterを使用して、EJBベースのTuxedoクライアント・サービスにアクセスできます。Oracle Tuxedo JCA AdapterがEJBを起動するには、EJBはweblogic.wtc.jatmi.TuxedoServiceインタフェースを使用する必要があります。このインタフェースは、リスト27に示すように、メソッドにより呼び出される単一のサービスを定義します。

リスト27 EJBサービス単一メソッド
public Reply service(TPServiceInformation svcinfo)
        throws TPException, TPReplyException, RemoteException;

TuxedoService.service()インタフェースを使用するEJBベース・サービス・アプリケーションを開発するには、次の手順を実行する必要があります。

  1. 入力データを取得してタスクを実行します。
  2. 出力データ用の型付きバッファを作成します。
  3. 呼出し側に戻される出力データを設定します。
  4. EJBデプロイメント記述子を構成します。

このセクションのコード例は、次の作業を行う方法を示しています。

サービス名はTOLOWERで構成が必要です。詳細は、「構成ファイルの例」を参照してください。EJBサービスは、入出力にSTRING型付きバッファを使用します。

リスト28に、TPServiceInformation(リスト27参照)を使用して、入力データを取得する方法の例を示します。

リスト28 TPServiceInformationから取得されるEJB入力データ
TypedString data;

...

data = (TypedString)mydata.getServiceData();

リスト29に示すように、入力データが小文字に変換されます。

リスト29 EJB入力データの小文字変換
String lowered;

...

lowered = data.toString().toLowerCase();

出力データがある場合、Oracle Tuxedo型付きバッファでラップする必要があります。リスト30に、TypedString型付きバッファを使用して出力データをラップする方法を示します。

リスト30 TypedString型付きバッファによるEJB出力データのラッピング
TypedString return_data;

...

return_data = new TypedString(lowered);

続いて、リスト31に示すように、型付き出力バッファが呼出し側にトランスポートされます(TPServiceInformationオブジェクトを使用)。

リスト31 EJB型付き出力バッファの呼出し側へのトランスポート
mydata.setReplyBuffer(return_data);

Tuxedo JCA Adapterが正常にEJBサービスを起動するためには、EJBデプロイメント記述子が、次の情報を使用して構成されている必要があります。

必須の接頭辞(tuxedo.services)とEJB名(TolowerHome)は、リスト32に示すようにOracle Tuxedo JCA Adapter構成ファイルの<EXPORT> <SOURCE>要素内で構成されています。

リスト32 EJB 「TOLOWER」の構成
<Export name="TOLOWER">
  <RemoteName>TOLOWER</RemoteName>
  <SessionName>session_1</SessionName>
  <Type>EJB</Type>
  <Source>tuxedo.services.TolowerHome</Source>
</Export>

Javaコードを正常にコンパイルするには、クライアント・アプリケーションは次のパッケージをインポートする必要があります。

リスト33に、EJBクライアント・アプリケーション・プログラムの例を表示します。

リスト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;
}

...

インバウンドPOJOサービスのプログラミング

Oracle Tuxedo JCA Adapterを使用して、Plain Old Java Object (POJO)ベースのTuxedoクライアント・サービスにアクセスすることができます。

Oracle Tuxedo JCA AdapterがPOJOサービスを起動するためには、POJOサービスが、エクスポートされた名前と同じ名前のメソッドを指定する必要があります。このメソッドは、TPServiceInformationTPRequestAsyncReplyの2つの固定した引数をとる必要があります。

TuxedoService.service()インタフェースを使用するPOJOベース・サービス・アプリケーションを開発するには、次の手順を実行する必要があります。

  1. 入力データを取得してタスクを実行します。
  2. 出力データ用の型付きバッファを作成します。
  3. 呼出し側に戻される出力データを設定します。
  4. Tuxedo JCA AdapterのPOJOハンドラに成功または失敗を通知します。
  5. POJOデプロイメント記述子を構成します。

このセクションのコード例は、次の作業を行う方法を示しています。

サービス名はMYTOLOWERで構成が必要です。詳細は、「構成ファイルの例」を参照してください。POJOサービスは、入出力にSTRING型付きバッファを必要とします。

リスト34に、TPServiceInformation(リスト27参照)を使用して、入力データを取得する方法の例を示します。

リスト34 入力TPServiceInformationから取得されるPOJO入力データ
TypedString typedstr;

...

data = (TypedString)svcinfo.getServiceData();

リスト35に示すように、入力データが小文字に変換されます。

リスト35 POJO入力データの小文字変換
String lower;

...

lower = typedstr.toString().toLowerCase();

出力データがある場合、Oracle Tuxedo型付きバッファでラップする必要があります。リスト36に、TypedString型付きバッファを使用して出力データをラップする方法を示します。

リスト36 TypedStringバッファによるPOJO出力データのラッピング
TypedString return_data;

...

return_data = new TypedString(lower);

続いて、リスト31に示すように、型付き出力バッファが呼出し側にトランスポートされます(TPServiceInformationオブジェクトを使用)。

リスト37 POJO型付き出力バッファの呼出し側へのトランスポート
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で構成される必要があります。

リスト38 POJO「TOLOWER_POJO」の構成
<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クライアント・アプリケーション・プログラムの例を表示します。

リスト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);
}

...

AUTOTRANプログラミング

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秒に設定されています。

リスト40 DMCONFIGファイルを使用するAUTOTRANの構成
....
<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を有効化する例を表示します。

リスト41 ra.xmlのプロパティを使用した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構成の例

Oracle Tuxedo JCA Adapter構成ファイルは、正式な構文のXMLファイルです。このファイルの場所は、ra.xmlファイルのリソース・アダプタ構成プロパティで構成されます。詳細は、 『Oracle JCAユーザーズ・ガイド』および『Oracle Tuxedo JCA Adapterリファレンス・ガイド』を参照してください。

リスト42に、構成ファイルをOracle Tuxedo JCA Adapterにリンクするra.xmlファイル・スニペットの例を示します。

リスト42 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ゲートウェイのリスニング・エンドポイントを定義します。

リスト43 Oracle Tuxedo JCA Adapter構成ファイル
<?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>

JCAアダプタAUTOTRAN構成

リスト44に、AUTOTRAN構成の例を示します。

リスト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環境ではコンソールで行うこともできます。
リスト45 AUTOTRANを有効化するプロパティの例
<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 UBBCONFIGおよびBDMCONFIGの例

アプリケーションを有効化するには、Oracle Tuxedo JCA Adapter構成ファイルを構成する以外に、Oracle Tuxedo UBBCONFIGおよびBDMCONFIG構成ファイルに、Oracle Tuxedo JCA Adapterの構成を含める必要があります。

リスト46およびリスト47に、Oracle Tuxedoアプリケーション・ドメイン内部のサービスと、ドメイン間リクエストを公開するために必要な、UBBCONFIGおよびBDMCONFIGファイル・スニペットの例を示します。

リスト46 UBBCONFIGファイル・スニペットの例
*SERVICES
TOUPPER
TOUPPER_V32
...
リスト47 BMDCONFIGファイル・スニペットの例
*DM_LOCAL_SERVICES
TOUPPER
TOUPPER_V32
...

*DM_REMOTE_SERVICES
TOLOWER
TOLOWER_POJO

 


関連項目


  先頭に戻る       前  次