|
注意 : | Oracle WebLogic Tuxedo Connector JATMI の詳細については、WebLogic クラスの Javadoc を参照してください。Oracle WebLogic Tuxedo Connector クラスは、weblogic.wtc.jatmi パッケージおよび weblogic.wtc.gwt パッケージに含まれています。 |
以下の節では、ユーザの入力を受け取り、サーバ プロセスまたは要求されたサービスを提供する発信オブジェクトにサービス リクエストを送信するクライアント EJB の作成方法について説明します。
Oracle WebLogic Tuxedo Connector JATMI
クライアント クラスは、Oracle Tuxedo で検出されたサービスにアクセスするクライアントを作成するために使用します。
Oracle Tuxedo および Oracle WebLogic Tuxedo Connector は、それぞれ異なった方法でサービスに接続します。
次の節では、Oracle Tuxedo および Oracle WebLogic Tuxedo Connector がアプリケーションに接続する方法を比較します。
tpinit()
を使用する。 config.xml
ファイル内に存在していて、サーバに対象として割り当てられている場合に、作成されます。TuxedoConnectionFactory
を使用して TuxedoConnection オブジェクトを取得した後、getTuxedoConnection() を使用して Oracle Tuxedo オブジェクトへの接続を作成する。次の例は、Oracle WebLogic Server アプリケーションが Oracle WebLogic Tuxedo Connector を使用してどのように Oracle Tuxedo アプリケーションに接続するのかを示しています。.
.
.
try {
ctx = new InitialContext();tcf =
} catch (NamingException ne) {
(TuxedoConnectionFactory)
ctx.lookup("tuxedo.services.TuxedoConnection");
// tuxedo オブジェクトを取得できなかった場合に TPENOENT を送出する
throw new TPException(TPException.TPENOENT,
"Could not get TuxedoConnectionFactory : " + ne);
}myTux = tcf.getTuxedoConnection();
.
.
.
次の節では、Oracle Tuxedo および Oracle WebLogic Tuxedo Connector がアプリケーションとの接続を切断する方法を比較します。
tpterm()
を使用する。
クライアント プロセスは、Java および JATMI プリミティブを使用して、次の基本アプリケーション タスクを提供します。
クライアントは、アプリケーションとの接続を切断する前に、いくつでもサービス リクエストを送信および受信できます。
TuxedoConnectionFactory を使用して JNDI ツリーで「tuxedo.services.TuxedoConnection
」をルックアップすることによって、リモート ドメインへの接続を確立し、TuxedoConnection
オブジェクトを取得します。
アプリケーションと Oracle Tuxedo の間でメッセージの送信および受信を行う場合は、次の TypedBuffer を使用します。
|
|||
|
|||
Oracle WebLogic Tuxedo Connector クライアントは、Oracle Tuxedo サービス アプリケーションとの間で以下の 3 タイプの通信をサポートしています。
注意 : | Oracle WebLogic Tuxedo Connector では、メッセージ リクエストの優先順位を設定するための JATMI プリミティブを提供していません。Oracle WebLogic Tuxedo Connector クライアントから発信されるすべてのメッセージは、メッセージ優先順位が 50 です。 |
Oracle WebLogic Tuxedo Connector クライアント アプリケーションと Oracle Tuxedo の間でリクエストを行い、応答メッセージを受信するには、次の JATMI プリミティブを使用します。
tpcall
は、サービスにリクエストを送信し、同期して応答を待つ場合に使用します。指定したサービスには、Oracle Tuxedo アプリケーションによって通知する必要があります。論理的には、tpcall()
の機能は、tpacall()
に次いで直ちに tpgetreply()
を呼び出した場合と同じです。
遅延同期 tpacall
を使用すると、Oracle Tuxedo サービスにリクエストを送信し、応答の待機を遅らせることができます。これにより、リクエストを送信し、別の作業を行ってから、応答を取り出すことができます。
遅延 tpacall()
サービス呼び出しは、Oracle Tuxedo サービスにリクエストを送信し、直ちに呼び出しから復帰します。指定したサービスには、Oracle Tuxedo アプリケーションによって通知する必要があります。呼び出しが正常に終了すると、tpacall()
は記述子として機能するオブジェクトを返します。これで呼び出しスレッドでは、他のタスクを実行できるようになります。呼び出し記述子を使用すると、以下のことを行えます。
応答を取り出す場合は、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 サービスと通信する会話型クライアントを作成する際に使用します。
Oracle WebLogic Tuxedo Connector クライアント アプリケーションと Oracle Tuxedo /Q の間のメッセージをエンキューおよびデキューするには、次の JATMI プリミティブを使用します。
オブジェクトへの接続を終了し、その後このオブジェクトで操作を行わないようにするには、tpterm() を使用します。
次の Java コードは、サーバに文字列引数を送信し、サーバから応答文字列を受信する ToupperBean.java
クライアント EJB の例です。
.
.
.
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());
}
.
.
.