プログラミング・ガイド

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

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

この章には次のトピックが含まれます:

 


概要

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

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

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

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

 


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

クライアント・アプリケーションの場合、Tuxedo JCA Adapterは、必要な接続の作成、セッション認証、データの機密性、データ変換、ルーティング/ロード・バランシングおよびトランザクションの各プロセスを実装します。これにより、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.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ユーザーズ・ガイド』を参照してください。

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」)を作成します。VIEW32ファイルに、ネストされたview32構造が含まれる場合、各ネスト・ビューに対応するJavaファイルが生成されます。

リスト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管理されたローカル・トランザクション・プログラミング

Tuxedo JCA Adapterは、CCIを使用する、ローカル管理されたトランザクション・クライアント・アプリケーションをサポートします。トランザクションごとのタイムアウトを設定するために、トランザクションには、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)から新しい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秒後にタイムアウトします。

注意: これは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で構成が必要です。詳細は、「構成ファイルの例」を参照してください。Oracle 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サービスのプログラミング

Tuxedo JCA Adapterを使用して、EJBベースのOracle Tuxedoクライアント・サービスにアクセスできます。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に示すように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サービスのプログラミング

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

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);

Tuxedo JCA Adapterが正常にPOJOサービスを起動するには、POJOデプロイメント記述子を構成する必要があります。リスト38に示すように、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プログラミング

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>
...

 


構成ファイルの例

Tuxedo JCA Adapterを実行するには、次のファイルを構成する必要があります。

Oracle Tuxedo JCA Adapter構成の例

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

リスト42に、構成ファイルを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に、次の項目にアクセスするTuxedo JCA Adapter DMCONFIGファイルの例を示します。

ローカル・アクセス・ポイントは、Tuxedo JCA Adapterのリスニング・エンドポイントを定義します。リモート・アクセス・ポイントは、Oracle Tuxedo GWTDOMAINゲートウェイのリスニング・エンドポイントを定義します。

リスト43 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>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環境ではコンソールで行うこともできます。
リスト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の例

アプリケーションを有効化するには、Tuxedo JCA Adapter構成ファイルを構成する以外に、Oracle Tuxedo UBBCONFIGおよびBDMCONFIG構成ファイルに、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

 


Oracle Tuxedo JCA Adapter MDBプログラミング

インタフェースのTuxedoMDBService

Tuxedo JCA Adapterでは、EJBアプリケーション・コードで実装する必要があるEJB MDBインタフェースが提供されます。

注意: MDBインタフェースは、Tuxedo JCA Adapterによってサポートされる既存のEJBと類似していますが、同じではありません。

リスト48は、インタフェースのリストを示しています。

リスト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コードの例を示しています。

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

IBM ASTKを使用したインバウンド・コネクタ・ベースMDBの作成

この手順では、WebSphere ASTK 6.1を使用してコネクタ・ベースEJB 2.1 MDBを作成します。シンプルなEJB MDBは、入力文字列をOracle Tuxedoクライアントにエコー・バックします。プロジェクト名はEchoMDBです。

J2EEパースペクティブの使用

「J2EE」パースペクティブがまだない場合、次を実行して「J2EE」パースペクティブを変更します。

「ウィンドウ」メニューからパースペクティブを開くJ2EEの順に選択します。

EJBプロジェクトの作成

「ファイル」メニューから、「新規」「プロジェクト」の順に選択します。「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

「OK」をクリックします。

図1 「EchoMDBプロパティ」ウィンドウ

「EchoMDBプロパティ」ウィンドウ

メッセージ・ドリブンBeanの作成

プロジェクト・エクスプローラの左ウィンドウ・ペインで、新規作成したMDBプロジェクトのEchoMDBを展開します。EchoMDB右クリックし、「新規」を選択して、「その他」を選択します。エンタープライズBeanを選択し、「次へ」をクリックします。図2に示すように「エンタープライズBeanの作成」ポップアップ・ウィンドウが表示されます。

ポップアップ・ウィンドウで、「メッセージドリブンBean」を選択します。EchoMDBという値でBean名を入力します。

図2 「エンタープライズBeanの作成」ウィンドウ

「エンタープライズBeanの作成」ウィンドウ

「次へ」をクリックします。図3に示すように、「メッセージドリブンBeanの種類」ポップアップ・ウィンドウが表示されます。その他の種類を選択し、「参照」をクリックします。TuxedoMDBServiceを入力し、図3のリストから選択して「OK」をクリックします。

図3 「メッセージドリブンBeanの種類」ウィンドウ

「メッセージドリブンBeanの種類」ウィンドウ

「メッセージドリブンBeanの種類」ポップアップ・ウィンドウが表示されます。「終了」をクリックします。

EchoBeanの変更

EchoMDBBean.javaが表示されるまで、左ウィンドウ・ペインのejbModuleを展開します。ECHOサービスを実行するには、EchoMDBBean.javaを変更する必要があります。EchoMDBBean.javaをダブルクリックすると、図4に示すようにデフォルトのエディタと共に「編集」ウィンドウ・ペインが表示されます。

図4 「編集」ウィンドウ

「編集」ウィンドウ

クラス・ファイルの最上段に、リスト1で示すように次の行を追加します。

リスト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()メソッドを編集します。

リスト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に示すように「デプロイ」を選択します。これによって、ビルド・ディレクトリのクラスにコンパイルされます。

図5 コンパイル

コンパイル

EJB JARファイルの作成

「プロジェクト・エクスプローラ」で「EchoMDB」プロジェクトを右クリックし、「エクスポート」を選択します。図6に示すように「エクスポート」ポップアップ・ウィンドウが表示されます。

図6 「エクスポート」ポップアップ・ウィンドウ

「エクスポート」ポップアップ・ウィンドウ

「エクスポート」ポップアップ・ウィンドウで、EJB JARファイルを選択します。「次へ」をクリックします。図7に示すように「EJB Jarのエクスポート」ポップアップ・ウィンドウが表示されます。ドロップダウン・メニューからEchoMDBを選択し、JARファイルの完全パスを「宛先」テキスト・フィールドに入力します。「終了」をクリックします。

図7 「EJB Jarのエクスポート」ポップアップ・ウィンドウ

「EJB Jarのエクスポート」ポップアップ・ウィンドウ

図8に示すように、「リソースの保存」ポップアップ・ウィンドウが表示されるので、「OK」をクリックします。

図8 「リソースの保存」ポップアップ・ウィンドウ

「リソースの保存」ポップアップ・ウィンドウ

Tuxedo JCA Adapterのディスパッチ・ベースMDBの場合、2種類のうちいずれかの方法でactivation-config-propertyejb-jar.xmlファイルに追加する必要があります。

  1. 第1の方法はJARファイルを解凍する方法です。JARファイルを解凍した後、META-INF/ejb-jar.xmlを変更してBeanのJARファイルを再JAR化します。 リスト1は、この種類のMDBに適したejb-jar.xmlサンプル・ファイルを示しています。
  2. リスト1 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>

ここで、eis/echoEchoMDBのJNDI名です。

  1. 同様に、第2の方法は、MDBをデプロイおよびエクスポートする前にASTKを使用して、ejb-jar.xmlファイルをactivation-config-propertyに直接追加する方法です。

 


Oracle Tuxedo会話型サーバーのプログラミングのヒント

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()を処理する一般的な会話型サーバー・コード例を次に示します。

リスト2
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()を開始することは許容されます。サーバーは、サービス・ルーチンが起動されるときにデータを受信しない可能性を想定する必要があります。

 


関連項目


  先頭に戻る       前  次