2 Oracle Weblogic Tuxedo ConnectorクライアントEJBの開発
この章の内容は以下のとおりです。
ノート:
Oracle WebLogic Tuxedo Connector JATMIの詳細は、「WebLogicクラスのJavaドキュメント」を参照してください。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オブジェクトの取得
-
メッセージ・バッファリングの実行
-
メッセージの送信および受信
-
Oracle Tuxedoオブジェクトへの接続の終了
クライアントは、アプリケーションとの接続を切断する前に、いくつでもサービス・リクエストを送信および受信できます。
Oracle Tuxedoオブジェクトの取得
TuxedoConnectionFactory
を使用してJNDIツリーで「tuxedo.services.TuxedoConnection」をルックアップすることによって、リモート・ドメインへの接続を確立し、TuxedoConnection
オブジェクトを取得します。
メッセージ・バッファリングの実行
アプリケーションとOracle Tuxedoの間でメッセージの送信および受信を行う場合は、次のTypedBuffersを使用します。
表2-1 TypedBuffers
バッファ・タイプ | 説明 |
---|---|
|
データがNULL文字で終了する文字の配列である場合に使用されるバッファ・タイプ。Oracle Tuxedoの等価タイプ: |
|
データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。Oracle Tuxedoの等価タイプ: |
|
データが自己定義である場合に使用されるバッファ・タイプ。各データ・フィールドは独自の識別子、オカレンス番号、および可能であれば長さインジケータを保持します。Oracle Tuxedoの等価タイプ: |
|
TypeFMLに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoの等価タイプ: |
|
データがXMLベースのメッセージである場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: XML (Tuxedoリリース7.1以降)。 |
|
VIEW記述ファイルを用いてバッファ構造を定義するためにアプリケーションがJava構造体を使用するとき、使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: |
|
VIEWに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoの等価タイプ: |
|
データがマルチバイト文字をサポートする多様な文字列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: |
メッセージの送信および受信
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プリミティブ
名前 | 操作 |
---|---|
|
Oracle Tuxedoサービスの非同期呼出しに使用します。このJATMIプリミティブには、2つの形式があります:
|
|
Oracle Tuxedoサービスの同期呼出しに使用します。 |
|
Oracle Tuxedoサービスへの遅延同期呼出しからの応答を取り出すために使用します。 |
|
ノート: 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
を使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。
会話型通信
ノート:
会話型通信の詳細は、「Oracle WebLogic Tuxedo Connector JATMI会話」を参照してください。
以下の会話プリミティブは、Oracle Tuxedoサービスと通信する会話型クライアントを作成する際に使用します。
表2-3 Oracle WebLogic Tuxedo Connectorの会話型クライアントのプリミティブ
名前 | 操作 |
---|---|
|
Oracle Tuxedo会話型サービスとの接続を確立するために使用します。 |
|
会話を管理するプロセスによって実行された場合に接続を中止し、TPEV_DISCONIMMイベントを生成するために使用します。 |
|
Oracle Tuxedoアプリケーションからオープンな接続を介してデータを受信するために使用します。 |
|
Oracle Tuxedoアプリケーションにオープンな接続を介してデータを送信するために使用します。 |
メッセージのエンキューとデキュー
Oracle WebLogic Tuxedo Connectorクライアント・アプリケーションとOracle Tuxedoの間のメッセージをエンキューおよびデキューするには、次のJATMIプリミティブを使用します。
表2-4 JATMIプリミティブ
名前 | 操作 |
---|---|
|
Oracle Tuxedo /Qからのメッセージ受信に使用します。 |
|
Oracle Tuxedo /Qにメッセージを配置するために使用します。 |
サンプル・クライアント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()); } . . .