ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Tuxedo Connectorプログラマーズ・ガイド
11g リリース1 (10.3.6)
B61627-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

2 Oracle Weblogic Tuxedo ConnectorクライアントEJBの開発

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

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


注意:

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

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

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

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

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

  • Oracle Tuxedoは、アプリケーションに接続するためにtpinit()を使用します。

  • Oracle WebLogic Tuxedo Connectorは、Oracle Tuxedoサービスへのパスを作成するために必要とされる情報を提供するためにWTCServer MBeanを使用します。セキュリティおよびクライアント認証は、WTCServer MBeanのRemote TDMコンポーネントおよびImported Services MBeanコンポーネントを構成することで提供されます。この経路は、Oracle WebLogic Server起動時に、WTCServer MBeanがconfig.xmlファイル内に存在していて、サーバーにターゲットとして割り当てられている場合に、作成されます。

  • Oracle WebLogic Tuxedo ConnectorはTuxedoConnectionFactoryを使用してTuxedoConnectionオブジェクトを取得した後、getTuxedoConnection()を使用してOracle Tuxedoオブジェクトへの接続を作成します。次の例は、Oracle WebLogic ServerアプリケーションがOracle WebLogic Tuxedo Connectorを使用してどのようにOracle Tuxedoアプリケーションに接続するのかを示しています。

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

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

// Could not get the tuxedo object, throw TPENOENT
throw new TPException(TPException.TPENOENT, 
     "Could not get TuxedoConnectionFactory : " + ne);
     } 

myTux = tcf.getTuxedoConnection();
.
.
.

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

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

  • Oracle Tuxedoは、アプリケーションとの接続を切断するためにtpterm()を使用します。

  • Oracle WebLogic Tuxedo Connectorは、JATMIプリミティブtpterm()を使用してOracle Tuxedoオブジェクトへの接続を終了します。

  • Oracle WebLogic Tuxedo Connectorは、WTCServer MBeanが新しいターゲット・サーバーに割り当てられるとき、またはサーバーの停止時にOracle Tuxedoサービスへの経路を閉じます。

クライアントの基本操作

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

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

Oracle Tuxedoオブジェクトの取得

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

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

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

表2-1 TypedBuffers

バッファ・タイプ 説明

TypedString

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

TypedCArray

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

TypedFML

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

TypedFML32

TypeFMLに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: FML32。

TypedXML

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

TypedVIEW

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

TypedVIEW32

VIEWに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: VIEW32。

TypedMBString

データがマルチバイト文字をサポートする多様な文字列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: MBSTRING。


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

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

  • リクエスト/レスポンス通信

  • 会話型通信

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

リクエスト/レスポンス通信


注意:

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

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

表2-2 JATMIプリミティブ

名前 操作
tpacall

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

  • 遅延同期

  • 非同期

tpcall

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

tpgetrply

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

tpcancel

tpacallによって返され、呼出し記述子に対応する未処理のメッセージ応答を取り消すために使用します。

注意: tpcancelを使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。


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

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

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

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

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

  • tpgetreply()を使用して送信したリクエストに対応した応答を取得します。

  • tpcancel()を使用して未処理のメッセージ応答を取り消します。

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

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

非同期呼出しの使用

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

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


注意:

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

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

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

  • 応答スレッドは、スレッド・プールから取得します。非同期のtpacall()を実行するスレッドは、応答メッセージを待ちません。

  • 応答スレッドのユーザー・コンテキストは、非同期tpacall()の元の呼出し側のコンテキストに戻ります。

  • コンテキストを復元し、非同期のtpacall()が発行されたときに中断された処理を再開するのは、コールバック・オブジェクトの役割となります。

  • 開発者は、マルチスレッド環境で処理を同期させる必要があります。たとえば、非同期のtpacall()リクエストを発行し、応答が直ちに返される場合は、呼出しスレッドが終了する前に、応答スレッドによってコールバック・オブジェクトを変更することができます。

  • 応答スレッドは、呼出しスレッドのトランザクション・コンテキストを保持しません。

  • 非同期のtpacall()がトランザクションに関与している場合、TpacallAsynchReplyを使用して応答を受け取ってからでないと、トランザクションがコミットされません。tpcancelを使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。

会話型通信


注意:

会話型通信の詳細は、第6章「Oracle Weblogic Tuxedo Connector JATMI会話」を参照してください。

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

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

名前 操作
tpconnect

Oracle Tuxedo会話型サービスとの接続を確立するために使用します。

tpdiscon

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

tprecv

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

tpsend

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


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

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

表2-4 JATMIプリミティブ

名前 操作
tpdequeue

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

tpenqueue

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


Oracle 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) {
          // Could not get the tuxedo object, throw 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();// Closing the association with Tuxedo

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