ナビゲーションをスキップ

WebLogic Tuxedo Connector プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

WebLogic Tuxedo Connector クライアント EJB の開発

注意 : WebLogic Tuxedo Connector JATMI の詳細については、「WebLogic クラスの Javadoc」を参照してください。WebLogic Tuxedo Connector クラスは、「weblogic.wtc.jatmi」および「weblogic.wtc.gwt」パッケージに含まれています。

以下の節では、ユーザの入力を受け取り、サーバ プロセスまたは要求されたサービスを提供する発信オブジェクトにサービス リクエストを送信するクライアント EJB の作成方法について説明します。

WebLogic Tuxedo Connector JATMI クライアント クラスは、Tuxedo で検出されたサービスにアクセスするクライアントを作成するために使用します。

 


アプリケーションとの接続および切断

Tuxedo および WebLogic Tuxedo Connector は、それぞれ異なった方法でサービスに接続します。

アプリケーションへの接続

次の節では、Tuxedo および WebLogic Tuxedo Connector がアプリケーションに接続する方法を比較します。

コード リスト 2-1Tuxedo アプリケーションに接続するためのクライアント コード例

.
.
.
try {
     ctx = new InitialContext();
     tcf =
          (TuxedoConnectionFactory)
          ctx.lookup("tuxedo.services.TuxedoConnection");
     } catch (NamingException ne) {

// tuxedo オブジェクトを取得できなかった場合に TPENOENT を送出する
throw new TPException(TPException.TPENOENT,
     "Could not get TuxedoConnectionFactory : " + ne);
     }

myTux = tcf.getTuxedoConnection();
.
.
.

アプリケーションからの切断

次の節では、Tuxedo および WebLogic Tuxedo Connector がアプリケーションとの接続を切断する方法を比較します。

 


クライアントの基本操作

クライアント プロセスは、Java および JATMI プリミティブを使用して、次の基本アプリケーション タスクを提供します。

クライアントは、アプリケーションとの接続を切断する前に、いくつでもサービス リクエストを送信および受信できます。

Tuxedo オブジェクトの取得

TuxedoConnectionFactory」を使用して JNDI ツリーで「tuxedo.services.TuxedoConnection」をルックアップすることによって、リモート ドメインへの接続を確立し、「getTuxedoConnection()」を使用して TuxedoConnection オブジェクトを取得します。

メッセージ バッファリングの実行

アプリケーションと Tuxedo 間でメッセージの送信および受信を行う場合は、次の「TypedBuffer」を使用します。

表 2-1 TypedBuffer

バッファ タイプ

説明

TypedString

データが NULL 文字で終了する文字の配列である場合に使用されるバッファ タイプ。Tuxedo の等価タイプ : STRING。

TypedCArray

データが、NULL 可能な文字の未定義配列 (バイト配列) である場合に使用されるバッファ タイプ。Tuxedo の等価タイプ : CARRAY。

TypedFML

データが自己定義である場合に使用されるバッファ タイプ。各データ フィールドは独自の識別子、オカレンス番号、および可能であれば長さインジケータを保持する。Tuxedo の等価タイプ : FML。

TypedFML32

TypeFML に似たバッファ タイプだが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能。Tuxedo の等価タイプ : FML32。

TypedXML

データが XML ベースのメッセージである場合に使用されるバッファ タイプ。Tuxedo の等価タイプ : XML (Tuxedo リリース 7.1 以降)。

TypedVIEW

VIEW 記述ファイルを用いてバッファ構造を定義するためにアプリケーションが Java 構造体を使用するとき、使用されるバッファ タイプ。Tuxedo の等価タイプ :VIEW。

TypedVIEW32

VIEW に似たバッファ タイプだが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能。Tuxedo の等価タイプ : VIEW32。

TypedXOctet

データが、NULL 可能な文字の未定義配列 (バイト配列) である場合に使用されるバッファ タイプ。X_OCTET のセマンティクスは CARRAY と同じ。Tuxedo の等価タイプ : X_OCTET。

TypedXCommon

VIEW のセマンティクスと同じバッファ タイプ。Tuxedo の等価タイプ : VIEW。

TypedXCType

VIEW のセマンティクスと同じバッファ タイプ。Tuxedo の等価タイプ : VIEW。

メッセージの送信および受信

WebLogic Tuxedo Connector クライアントは、Tuxedo サービス アプリケーションとの間で以下の 3 タイプの通信をサポートしています。

要求/応答通信

注意 : WebLogic Tuxedo Connector では、メッセージ リクエストの優先順位を設定するための JATMI プリミティブを提供していません。WebLogic Tuxedo Connector クライアントから発信されるすべてのメッセージは、メッセージ優先順位が 50 です。

WebLogic Tuxedo Connector クライアント アプリケーションと Tuxedo 間でリクエストを行い、応答メッセージを受信するには、次の「JATMI」プリミティブを使用します。

表 2-2 JATMI プリミティブ

名前

操作

tpacall

Tuxedo サービスの非同期呼び出しに使用する。この JATMI プリミティブには以下の 2 つの形式がある。

  • 遅延同期

  • 非同期

tpcall

Tuxedo サービスの同期呼び出しに使用する。

tpgetrply

Tuxedo サービスへの遅延同期呼び出しからの応答を取り出すために使用する。

tpcancel

tpacall によって返され、呼び出し記述子に対応する未処理のメッセージ応答をキャンセルするために使用する。

注意 : tpcancel を使用して、トランザクションに関連付けられている呼び出し記述子をキャンセルすることはできない。

同期サービス呼び出しの使用

tpcall は、サービスにリクエストを送信し、同期して応答を待つ場合に使用します。指定したサービスには、Tuxedo アプリケーションによって通知する必要があります。論理的には、tpcall() の機能は、tpacall() に次いで直ちに tpgetreply() を呼び出した場合と同じです。

遅延同期サービス呼び出しの使用

遅延同期 tpacall を使用すると、Tuxedo サービスにリクエストを送信し、応答の待機を遅らせることができます。これにより、リクエストを送信し、別の作業を行ってから、応答を取り出すことができます。

遅延 tpacall() サービス呼び出しは、Tuxedo サービスにリクエストを送信し、直ちに呼び出しから復帰します。指定したサービスには、Tuxedo アプリケーションによって通知する必要があります。呼び出しが正常に終了すると、tpacall() は記述子として機能するオブジェクトを返します。これで呼び出しスレッドでは、他のタスクを実行できるようになります。呼び出し記述子を使用すると、以下のことを行えます。

応答を取り出す場合は、tpgetreply() を使用して、tpacall() によって返される呼び出し記述子を指定して応答をデキューします。応答がすぐに取り出せない場合、呼び出しスレッドは応答をポーリングします。

tpacall() がトランザクションに関与している場合、tpgetreply() を使用して応答を受け取ってからでないと、トランザクションがコミットされません。tpcancel を使用して、トランザクションに関連付けられている呼び出し記述子をキャンセルすることはできません。たとえば、1 つのトランザクションで 3 つの tpacall() リクエストを発行する場合、トランザクションをコミットするには、3 つの tpgetreply() 呼び出しを行い、各リクエストの応答のデキューに成功する必要があります。

非同期呼び出しの使用

非同期の tpacall を使用すると、Tuxedo サービスにリクエストを送信してから、スレッド プールへの呼び出しを実行したスレッド リソースを解放できます。これにより、大量の未処理リクエストを少数のスレッドで処理することができます。

非同期の tpacall() サービス呼び出しは、リクエストを Tuxedo サービスに送信します。指定したサービスには、Tuxedo アプリケーションによって通知する必要があります。呼び出しが正常に終了すると、非同期の tpacall() は記述子として機能するオブジェクトを返します。これで呼び出しスレッドでは、他のタスクを実行できるようになります。呼び出し記述子を使用すると、送信したメッセージ リクエストに対応した TpacallAsynchReply からのメッセージ応答を識別したり、tpcancel() を使用して未処理のメッセージ応答をキャンセルしたりできます。

注意 : 呼び出し記述子を使用して、tpgetreply() を呼び出すことはできません。

サービスの応答が用意されたら、別のスレッドで callback オブジェクトが呼び出されます。元のリクエストが成功した場合、TpacallAsynchReply.sucess メソッドがサービスからの応答を返します。元のリクエストが失敗した場合、TpacallAsynchReply.failure メソッドがエラー コードを返します。

以下のガイドラインに従って、callback オブジェクトを実装する必要があります。

対話通信

注意 : 対話通信の詳細については、「WebLogic Tuxedo Connector JATMI 会話」を参照してください。

以下の「会話プリミティブ」は、Tuxedo サービスと通信する対話クライアントを作成する際に使用します。

表 2-3 WebLogic Tuxedo Connector の対話クライアントのプリミティブ

名前

操作

tpconnect

Tuxedo 対話サービスとの接続を確立するために使用する。

tpdiscon

対話を管理するプロセスによって実行された場合に接続を中止し、TPEV_DISCONIMM イベントを生成するために使用する。

tprecv

Tuxedo アプリケーションからオープンな接続を介してデータを受信するために使用する。

tpsend

Tuxedo アプリケーションにオープンな接続を介してデータを送信するために使用する。

メッセージのエンキューとデキュー

WebLogic Tuxedo Connector クライアント アプリケーションと Tuxedo /Q 間のメッセージをエンキューおよびデキューするには、次の「JATMI」プリミティブを使用します。

表 2-4 JATMI プリミティブ

名前

操作

tpdequeue

Tuxedo /Q からのメッセージ受信に使用する。

tpenqueue

Tuxedo /Q にメッセージを配置するために使用する。

Tuxedo オブジェクトへの接続の終了

オブジェクトへの接続を終了し、その後このオブジェクトで操作を行わないようにするには、「tpterm()」を使用します。

 


クライアント EJB の例

次の Java コードは、サーバに文字列引数を送信し、サーバから応答文字列を受信する ToupperBean.java クライアント EJB の例です。

コード リスト 2-2クライアント アプリケーションの例

.
.
.
public String Toupper(String toConvert)
   throws TPException, TPReplyException
{
     Context ctx;
     TuxedoConnectionFactory tcf;
     TuxedoConnection myTux;
     TypedString myData;
      Reply myRtn;
     int status;

     log("toupper called, converting " + toConvert);

     try {
           ctx = new InitialContext();
          tcf = (TuxedoConnectionFactory) ctx.lookup(
                 "tuxedo.services.TuxedoConnection");
     }
     catch (NamingException ne) {
          // tuxedo オブジェクトを取得できなかった場合に TPENOENT を送出する
            throw new TPException(TPException.TPENOENT, "Could not get TuxedoConnectionFactory : " + ne);
      }

     myTux = tcf.getTuxedoConnection();

     myData = new TypedString(toConvert);

     log("About to call tpcall");
      try {
          myRtn = myTux.tpcall("TOUPPER", myData, 0);
}
     catch (TPReplyException tre) {
          log("tpcall threw TPReplyExcption " + tre);
           throw tre;
     }
      catch (TPException te) {
           log("tpcall threw TPException " + te);
           throw te;
      }
      catch (Exception ee) {
           log("tpcall threw exception: " + ee);
           throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
      }
     log("tpcall successfull!");

      myData = (TypedString) myRtn.getReplyBuffer();

      myTux.tpterm(); // Tuxedo との関連付けの終了

      return (myData.toString());
}
.
.
.

 

フッタのナビゲーションのスキップ  ページの先頭 前 次