TuxedoJavaServer
は抽象クラスです。サービスを実装するすべてのユーザー定義クラスによって継承される必要があります。
Oracle Tuxedo Javaサーバーで提供されるTJATMIプリミティブにアクセスするには、すべてのTJATMIプリミティブを実装するTuxAppContext
オブジェクトを取得する必要があります。
サービス・クラスはTuxedoJavaServer
から継承するため、サービスでgetTuxAppContext()
を呼び出してコンテキスト・オブジェクトを取得します。ただし、tpsvrinit()
ではTuxAppContext
を取得できません。この時点でTuxAppContext
は準備ができていないためです。tpsvrinit()
でTuxAppContext
オブジェクトを取得しようとすると、tpsvrinit()
が失敗して、例外がスローされます。
TJATMIは、サービスの呼出し、トランザクションの開始と終了、DataSourceへの接続の取得など、クライアントとサーバー間の通信を提供する一連のプリミティブです。
詳細は、Java Server Javadocを参照してください。
注: | tpreturn が実行を終了した後も、サービスは実行し続けます。tpreturn() をサービスの最後の実行文として指定してください。 |
ATMI Javaサーバーは、Oracle Tuxedo型付きバッファに対応するOracle WebLogic Tuxedo Connector TypedBufferを再利用します。メッセージは、サーバーの型付きバッファに渡されます。ATMI Javaサーバーによって提供されるバッファ・タイプを表2-3に示します。
TypedBufferの詳細は、weblogic.wtc.jatmiのパッケージを参照してください。
また、Javaサーバー・クラスでTypedFML/TypedFML32またはTypedView/TypedView32(あるいはその両方)を使用する場合は、「リファレンス」の「Oracle Tuxedo JavaサーバーでのFMLの使用」および「Oracle Tuxedo JavaサーバーでのVIEWの使用」の情報が役立ちます。
TPSVCINFO
クラスを使用して、Oracle Tuxedoクライアントによって送信されるサービス情報を取得または設定します。
TuxATMIReply
を使用して、サービス呼出しの返信データとメタデータを取得します。
tpcall()
などのサービスでJATMIプリミティブによってスローされる例外を捕捉する必要があります。JATMIがスローする例外は2種類あります。
詳細は、Java Server Javadocを参照してください。
従来のTuxedo ATMIの場合と同じく、TMTRACE=atmi:ulog
をエクスポートする必要もあります。TJATMI APIトレースは他のATMIトレースとしてULOGに書き込まれます。
Tuxedo 12cリリース2 (12.1.3)から、Tuxedo Javaサーバーにイベント、任意通知型メッセージ、/Q、非同期コール、ブロック時間制御、サーバー・サービス転送などの一連のJava APIが追加されました。新しく追加されたJava APIの詳細は、Javadocを参照してください。
注: | tpappthrinit() およびtpappthrterm() 以外のすべてのAPIは、TuxAppContext オブジェクトが正しく作成されて呼出し側から取得された場合にのみ呼び出す必要があります。 |
Tuxedo Java APIのほとんどは、有効なTuxedoコンテキストで呼び出す必要があります。これらのAPIを呼び出す前に、有効なTuxedoコンテキストを取得する必要があります。
public int tpsvrinit()
{
TuxAppContext myAppCtxt = null;
try {
int cd;
TypedString rqstData = new TypedString("hello”);
TuxATMIReply rply = null;
myAppCtxt = getTuxAppContext();
cd = myAppCtxt.tpacall("data_process", rqstData, 0);
rply = myAppCtxt.tpgetrply(cd, 0);
...
} catch (TuxATMITPException ex) {
} catch (Throwable ex) {
}
return 0;
}
public void tpsvrdone()
{
TuxAppContext myAppCtxt = null;
try {
TypedString rqstData = new TypedString("hello”);
TuxATMIReply rply = null;
myAppCtxt = getTuxAppContext();
rply = myAppCtxt.tpcall("data_process", rqstData, 0);
...
} catch (TuxATMITPException ex) {
} catch (Throwable ex) {
}
return;
}
public void MYSERVICE(TPSVCINFO rqst)
{
TuxAppContext myAppCtxt = null;
try {
TypedFML32 rqstData = (TypedFML32)rqst.getServiceData();
TuxATMIReply rply = null;
TypedFML32 rplyData = null;
myAppCtxt = getTuxAppContext();
rply = myAppCtxt.tpcall("data_process", rqstData, 0);
rplyData = (TypedFML32)rply.getReplyBuffer();
myAppCtxt.tpreturn(TPSUCCESS, 0, rplyData, 0);
} catch (TuxATMITPException ex) {
} catch (Throwable ex) {
}
return;
}
public void MYSERVICE(TPSVCINFO rqst)
{
TuxAppContext myAppCtxt = null;
try {
TypedFML32 rqstData = (TypedFML32)rqst.getServiceData();
TuxATMIReply rply = null;
TypedFML32 rplyData = null;
myAppCtxt = getTuxAppContext();
rply = myAppCtxt.tpcall("data_process", rqstData, 0);
rplyData = (TypedFML32)rply.getReplyBuffer();
myAppCtxt.tpforward("FWD_SVC", rplyData, 0);
} catch (TuxATMITPException ex) {
} catch (Throwable ex) {
}
return;
}
public class SimpServTuxAppThread implements Runnable, TuxATMIConstants {
public void run() {
try {
TPINIT tpinfo = null;
int rtn = 0;
rtn = TuxAppContextUtil.tpappthrinit(tpinfo);
TuxAppContext myAppCtxt = null;
myAppCtxt = TuxAppContextUtil.getTuxAppContext();
TuxATMIReply rply = null;
TypedString rqStr = new TypedString("Is_is_simple_appThread_test");
rply = myAppCtxt.tpcall("SVC", rqStr, TPNOTIME|TPSIGRSTRT);
rtn = TuxAppContextUtil.tpappthrterm();
} catch (TuxATMITPException ex) {
} catch (Throwable ex) {
}
}
}
前述の例では、有効なTuxedoアプリケーション・コンテキストは、アプリケーションによって作成されたJavaサーバー・スレッドでTuxAppContextUtil.tpappthrinit()
を呼び出すことで作成できます。TuxAppContextUtil.tpappthrinit()
の呼出しに成功すると、TuxAppContextUtil.getTuxAppContext()
メソッドを呼び出して有効なTuxedoアプリケーション・コンテキストを取得し、その後Tuxedo Java APIをコンテキストに呼び出すことができます。