Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Tuxedo Connectorプログラマーズ・ガイド 11g リリース1 (10.3.6) B61627-03 |
|
![]() 前 |
![]() 次 |
以下の節では、ユーザーの入力を受け取り、サーバー・プロセスまたはリクエストされたサービスを提供する発信オブジェクトにサービス・リクエストを送信するクライアント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オブジェクトの取得
メッセージ・バッファリングの実行
メッセージの送信および受信
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 |
注意: 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クライアント・アプリケーションとOracle Tuxedoの間のメッセージをエンキューおよびデキューするには、次のJATMIプリミティブを使用します。
オブジェクトへの接続を終了し、その後このオブジェクトで操作を行わないようにするには、tpterm()を使用します。
次の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()); } . . .