ATMI Javaサーバーのユーザー・インタフェース
TuxedoJavaServerは抽象クラスです。サービスを実装するすべてのユーザー定義クラスによって継承される必要があります。
表2-1
TuxedoJavaServerインタフェース
|
|
|
初期化処理を実行するために、子クラスが実装する必要がある抽象メソッド
|
|
クリーンアップ処理を実行するために、子クラスが実装する必要がある抽象メソッド
|
|
現在アタッチされているTuxedoアプリケーションJavaコンテキストを取得するために使用
|
Oracle Tuxedo Javaサーバーで提供されるTJATMIプリミティブにアクセスするには、すべてのTJATMIプリミティブを実装する
TuxAppContextオブジェクトを取得する必要があります。
サービス・クラスは
TuxedoJavaServerから継承するため、サービスで
getTuxAppContext()を呼び出してコンテキスト・オブジェクトを取得します。ただし、
tpsvrinit()では
TuxAppContextを取得できません。この時点で
TuxAppContextは準備ができていないためです。
tpsvrinit()で
TuxAppContextオブジェクトを取得しようとすると、
tpsvrinit()が失敗して、例外がスローされます。
Tuxedo JavaアプリケーションのTJATMIプリミティブ
TJATMIは、サービスの呼出し、トランザクションの開始と終了、DataSourceへの接続の取得など、クライアントとサーバー間の通信を提供する一連のプリミティブです。
|
|
|
要求/応答通信でOracle Tuxedoサービスの同期呼出しに使用する。
|
|
サービス・リクエストを送信し、その応答を待つルーチン
|
|
|
|
未終了の応答に対する呼出し記述子を無効にするためのルーチン
|
|
|
|
|
|
|
|
|
|
|
|
|
|
現在のトランザクションをコミットするために使用します。
|
|
現在のトランザクションを強制終了するために使用します。
|
|
|
|
|
|
トランザクション・モードかどうかチェックするルーチン
|
|
tpcommit()がいつ戻るかを設定するルーチン
|
|
|
|
|
|
以前に設定された、1秒または1ミリ秒当たりの非トランザクション・ブロック時間値を戻すルーチン
|
|
次のサービス呼出しまたはコンテキストごとに使用されるすべてのサービス呼出しの非トランザクション・ブロック時間値を秒単位またはミリ秒単位で設定するルーチン
|
|
|
|
|
|
現在のアプリケーション関連のコンテキスト識別子を取り出す
|
|
現在のアプリケーション関連にコンテキスト識別子を設定
|
|
アプリケーション生成のサーバー・スレッドで新しいTuxedoコンテキストを生成および初期化するルーチン
|
|
サーバー・プロセス内のアプリケーション生成のコンテキストを終了するルーチン
|
|
Tuxedo Javaサーバーで戻り値とデータを設定するために使用します。
|
|
トランザクションが進行中かどうかをチェックするために使用します。
|
|
構成したDataSourceへの接続を取得するために使用します。
|
|
ユーザー・ログをTuxedoユーザー・ログ・ファイルに出力するために使用します。
|
注意:
|
tpreturnが実行を終了した後も、サービスは実行し続けます。 tpreturn()をサービスの最後の実行文として指定してください。
|
Tuxedo Java APIのほとんどは、有効なTuxedoコンテキストで呼び出す必要があります。これらのAPIを呼び出す前に、有効なTuxedoコンテキストを取得する必要があります。
次の例では、Java APIでのプログラム方法を示します。
リスト2-1
サーバーの初期化および終了段階でAPIを呼び出す場合の例
TuxAppContext myAppCtxt = null;
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) {
TuxAppContext myAppCtxt = null;
TypedString rqstData = new TypedString("hello���);
TuxATMIReply rply = null;
myAppCtxt = getTuxAppContext();
rply = myAppCtxt.tpcall("data_process", rqstData, 0);
} catch (TuxATMITPException ex) {
リスト2-2
サービス・ルーチンでAPIを呼び出す場合の例
public void MYSERVICE(TPSVCINFO rqst)
TuxAppContext myAppCtxt = null;
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) {
public void MYSERVICE(TPSVCINFO rqst)
TuxAppContext myAppCtxt = null;
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) {
リスト2-4
アプリケーション・サーバー・スレッドでAPIを呼び出す場合の例
public class SimpServTuxAppThread implements Runnable, TuxATMIConstants {
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) {
注意:
|
前述の例では、有効なTuxedoアプリケーション・コンテキストは、アプリケーションによって作成されたJavaサーバー・スレッドで TuxAppContextUtil.tpappthrinit() を呼び出すことで作成できます。 TuxAppContextUtil.tpappthrinit()の呼出しに成功すると、 TuxAppContextUtil.getTuxAppContext()メソッドを呼び出して有効なTuxedoアプリケーション・コンテキストを取得し、その後Tuxedo Java APIをコンテキストに呼び出すことができます。
|
Tuxedo JavaアプリケーションのTypedBuffer
ATMI Javaサーバーは、Oracle Tuxedo型付きバッファに対応するOracle WebLogic Tuxedo Connector TypedBufferを再利用します。メッセージは、サーバーの型付きバッファに渡されます。ATMI Javaサーバーによって提供されるバッファ・タイプを
表2-3に示します。
|
|
|
データがNULL文字で終了する文字の配列である場合に使用されるバッファ・タイプ。Oracle Tuxedoの等価タイプ: STRING。
|
|
データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。Oracle Tuxedoの等価タイプ: CARRAY。
|
|
データが自己定義である場合に使用されるバッファ・タイプ。データ・フィールドごとに個別の識別子、出現回数、および必要に応じて長さを示す情報を保持します。Oracle Tuxedoの等価タイプ: FML。
|
|
TypeFMLに似たバッファ・タイプだが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能。Oracle Tuxedoの等価タイプ: FML32。
|
|
データがXMLベースのメッセージである場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: XML (Tuxedoリリース7.1以降)。
|
|
VIEW記述ファイルを用いてバッファ構造を定義するためにアプリケーションがJava構造体を使用するとき、使用されるバッファ・タイプ。Oracle Tuxedoの等価タイプ: VIEW
|
|
VIEWに似たバッファ・タイプだが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能。Oracle Tuxedoの等価タイプ: VIEW32。
|
また、Javaサーバー・クラスでTypedFML/TypedFML32またはTypedView/TypedView32 (あるいはその両方)を使用する場合は、
「リファレンス」の「Oracle Tuxedo JavaサーバーでのFMLの使用」および「Oracle Tuxedo JavaサーバーでのVIEWの使用」の情報が役立ちます。
•
|
別のTypedFML32に埋め込まれているTypedFML32のFldid()/Fname()は機能できません。この問題に対処するには、名前またはIDの転送のかわりに fieldtableクラスを使用します。
|
•
|
現時点で weblogic.wtc.gwt.XmlViewCnv/XmlFmlCnvクラスは使用できません。
|
TPSVCINFOクラスを使用して、Oracle Tuxedoクライアントによって送信されるサービス情報を取得または設定します。
|
|
|
Oracle Tuxedoクライアントから送信されるサービス・データを返すために使用する。
|
|
Oracle Tuxedoクライアントから送信されるサービス・フラグを返すために使用する。
|
|
|
|
アプリケーション認証クライアント・キーを取得するために使用されます。
|
|
最初のクライアントのクライアントIDを取得するために使用されます。
|
TuxATMIReplyを使用して、サービス呼出しの返信データとメタデータを取得します。
|
|
|
サービスから返される型付きバッファ(nullの可能性あり)を返します。
|
|
|
tpcall()などのサービスでJATMIプリミティブによってスローされる例外を捕捉する必要があります。JATMIがスローする例外は2種類あります。
•
|
TuxATMITPException: TJATMI障害を表す例外。
|
•
|
TuxATMITPReplyException: サービス障害( TPESVCFAILまたは TPSVCERROR)があった場合にスローされる例外。ユーザー・データがこの例外に関連付けられることがあります。
|
従来のTuxedo ATMIの場合と同じく、
TMTRACE=atmi:ulogをエクスポートする必要もあります。TJATMI APIトレースは他のATMIトレースとしてULOGに書き込まれます。