Oracle Tuxedo JavaサーバーでのFMLの使用
FMLは、フィールド・バッファと呼ばれる記憶構造を定義および操作するJava言語機能のセットです。各フィールド・バッファには、フィールドに属性および値の組合せが含まれています。各フィールドは次のように構成されます。
•
|
フィールド長および識別子に16ビット値を使用するFML16。一意のフィールド数が8191、個々のフィールド長が64Kバイト、フィールド・バッファの合計サイズが64Kバイトに制限されています。
|
•
|
フィールド長および識別子に32ビット値を使用するFML32。約3千万のフィールド、約20億バイトのフィールド長およびバッファ長が使用できます。
|
Oracle WebLogic Tuxedo Connector FML API
FMLアプリケーション・プログラム・インタフェース(API)は、WebLogic ServerクラスのJavadocに含まれているweblogic.wtc.jatmiパッケージにドキュメント化されています。
フィールド表は、Oracle Tuxedoフィールド表に似た方法で生成されます。フィールド表は、2つのシステム間で共通のフィールド名定義、フィールド・タイプ、および識別番号を提供するテキスト・ファイルです。FMLを使用してOracle Tuxedoシステムと相互運用するには、次の手順を実行する必要があります。
1.
|
Oracle TuxedoシステムからOracle Tuxedo Javaサーバー環境に、フィールド表をコピーします。
|
例: Oracle Tuxedo配布キットには、bankappという銀行アプリケーション・サンプルが含まれています。このアプリケーションには、次の構造を持つbankfldsというファイルがあります。
# name number type flags comments
2.
|
フィールド表定義をJavaソース・ファイルに変換します。weblogic.wtc.jatmiパッケージのmkfldclass/mkfldclass32ユーティリティを使用します。このクラスは、FML/FML32フィールド表を読み取るユーティリティ機能で、FldTblインタフェースを実装するJavaファイルを生成します。このユーティリティには、次のような2つのインスタンスがあります。
|
コマンドの正しいインスタンスを使用して、bankfldsフィールド表をFML32 Javaソースに変換します。次は、mkfldclassを使用した例です。
java weblogic.wtc.jatmi.mkfldclass bankflds
作成されたファイルは
bankflds.javaとなり、次のような構造を持ちます。
import weblogic.wtc.jatmi.*;
public final class bankflds
implements weblogic.wtc.jatmi.FldTbl
/** number: 110 type: long */
public final static int ACCOUNT_ID = 33554542;
/** number: 112 type: char */
public final static int ACCT_TYPE = 67108976;
/** number: 109 type: string */
public final static int ADDRESS = 167772269;
/** number: 117 type: float */
3.
|
次のコマンドを使用して、作成したbankflds.javaファイルをコンパイルします。
|
コンパイルすると、
bankflds.classファイルとなります。ロード時、Oracle Tuxedo Javaサーバーはクラス・ファイルを使用してFMLフィールドからフィールド・エントリを追加、検索および削除します。
4.
|
Tuxedo Javaサーバーの構成ファイルの<Resources>セクションに、フィールド表クラスを追加します(Tuxedo Javaサーバーの構成ファイルの<ClassPath>にも含めます)。
|
<FieldTable16Classes>bankflds</FieldTable16Classes>
5.
|
フィールド表のクラス定義をロードするために、Tuxedo Javaサーバーを再起動します。
|
mkfldclass32クラスに対するDynRdHdrプロパティの使用
以下の場合には、DynRdHdrユーティリティを使用する必要があります。
•
|
非常に大きなFML表を使用しているので、mkfldclass32クラスで作成された.javaメソッドが、単一のクラスまたはインタフェースの全体的な複雑度に関する内部Java仮想マシンの制限を超えます。
|
•
|
非常に大きなFML表を使用しているので、.javaメソッドをコンパイルして作成されたクラスをロードできません。
|
FML表をコンパイルする場合には、次の手順でDynRdHdrプロパティを使用します。
1.
|
フィールド表定義をJavaソース・ファイルに変換します。
|
2.
|
java -DDynRdHdr=Path_to_Your_FML_Table
|
weblogic.wtc.jatmi.mkfldclass32 userTable
表4-1
DynRdHdrプロパティを使用するコマンドの引数
|
|
|
FML表をコンパイルするためのOracle WebLogic Tuxedo Connectorプロパティ。
|
|
FML表のパス名。サーバーのCLASSPATHでリソース・ファイルとして検索可能な完全修飾パスまたは相対パスを指定します。
|
weblogic.wtc.jatmi.mkfldclass32
|
このクラスは、FML32フィールド表を読み取るユーティリティ機能で、FldTblインタフェースを実装するJavaファイルを生成する。
|
|
mkfldclass32クラスによって作成される.javaメソッドの名前。
|
3.
|
次のコマンドを使用して、 userTableファイルをコンパイルします。
|
4.
|
Tuxedo Javaサーバーの構成ファイルの<Resources>セクションに、フィールド表クラスを追加します(Tuxedo Javaサーバーの構成ファイルの<ClassPath>にも含めます)。
|
<FieldTable32Classes>userTable</FieldTable32Classes>
5.
|
フィールド表のクラス定義をロードするために、Tuxedo Javaサーバーを再起動します。
|
userTable.classファイルの作成後は、
userTable.classを手動で更新しなくてもFML表を変更してその変更をデプロイできます。Javaサーバーは起動時に、更新されたFML表をロードします。
Path_to_Your_FML_Table属性を変更した場合、前の手順に従って
userTable.javaおよび
userTable.classファイルを更新する必要があります。
TypedFML32でパフォーマンスの向上を実現する
2つの新しいTypedFML32コンストラクタを使用すると、パフォーマンスが向上します。これらのコンストラクタの使用については、以下を参照してください。
コンストラクタは、WebLogic ServerクラスのJavadocに定義されます。
TypedFML32でパフォーマンスの向上を実現するためには、TypedFML32コンストラクタにサイズ・ヒントを指定します。これらのコンストラクタで利用できるパラメータは、以下の2つです。
•
|
フィールドの最大数のヒントを指定するパラメータ。すべての発生数を指定します。
|
•
|
バッファで使用されるフィールドIDの総数を指定するパラメータ。
|
たとえば、バッファで使用されるフィールド表に20個のフィールドIDを格納し、各フィールドを20回発生させることができます。この場合、最初のパラメータにフィールドの最大数400を指定する必要があります。2番目のパラメータにフィールドIDの総数20を指定する必要があります。
TypeFML32 mybuffer = new TypeFML32(400, 20);
注意:
|
通常、バッファのサイズに制限はありませんが、非常に小さいサイズでは、うまく機能しません。
|
非常に小さいバッファを使用する場合は、これらのコンストラクタをヒントなしで使用します。非常に小さいバッファとは、たとえば、フィールドの総発生回数が16より小さいバッファを指します。たとえば、フィールドの総発生回数が250000を超える非常に大きいバッファの場合は、アプリケーションでフィールドの総発生回数250000より小さいバッファに分割することを検討する必要があります。
Oracle Tuxedo JavaサーバーでのVIEWの使用
Oracle Tuxedo Javaサーバーを使用すると、非依存型C構造体から派生したOracle Tuxedo
VIEWバッファ・タイプと同様のJava
VIEWバッファを使用できます。これにより、Oracle Tuxedo Javaサーバー・クラスおよびOracle Tuxedoアプリケーションが共通の構造体を使用して情報を受け渡しできます。
Oracle Tuxedo Javaサーバー・クラスとOracle Tuxedoアプリケーションは、
VIEW記述で定義された同一の情報構造を共有する必要があります。
VIEW記述ファイルの各構造体には次の形式を使用します。
type cname fbname count flag size null
•
|
viewjコンパイラとOracle Tuxedo viewcコンパイラの両方で同一の VIEW記述ファイルが使用される。
|
•
|
行頭に #または $文字を付けてコメント行を挿入できます。
|
•
|
各構造体用の VIEW記述ファイルに指定する必要があるフィールドを、次の表で説明します。
|
|
|
|
フィールドのデータ型。設定できる型は、 short、 long、 float、 double、 char、 string、 carrayまたは dec_t(パック10進数)。
|
|
|
|
|
|
|
|
•
|
C - 連想カウント・メンバー(ACM)に追加フィールドを生成
|
•
|
L - STRINGおよび CARRAYに転送されるバイト数を保持
|
|
|
STRINGまたは CARRAY型レコードの最大長を指定します。それ以外のバッファ・タイプでは、このフィールドは無視されます。
|
|
ユーザー指定の NULL値、またはマイナス記号( -)の場合にはフィールドのデフォルト値を示します。 VIEW型バッファで使用される NULL値は空のC構造体メンバーを示します。
数値型の場合、デフォルトの NULL値は 0 ( dec_tの場合は 0.0)になります。文字型の場合、デフォルトの NULL値は \0になります。 STRING型と CARRAY型の場合、デフォルトの NULL値は" "になります。
エスケープ文字として使用されている定数も、 NULL値の指定に使用できます。 VIEWコンパイラが認識するエスケープ定数は次のとおりです。 \ddd (dは8進数)、 \0、 \n、 \t、 \v、 \r、 \f、 \\、 \'および \"。
STRING、 CARRAYおよびchar型の NULL値を、二重引用符または単一引用符で囲んでもかまいません。ユーザー指定の NULL値内のエスケープされていない引用符は、 VIEWコンパイラでは受け付けられません。
VIEWメンバー記述の NULLフィールドでキーワード「 NONE」を指定することもできます。この指定は、そのメンバーには NULL値がないことを意味します。文字列および文字配列メンバーの最大サイズのデフォルト値は2660文字です。
|
次に、Oracle Tuxedoアプリケーションと情報を送受信するために
VIEWバッファを使用するサンプル
VIEW記述を示します。この
VIEWのファイル名は
infoencです。
#type cname fbname count flag size null
float amount AMOUNT 2 - - 0.0
short status STATUS 2 - - 0
char mychar MYCHAR 2 - - -
string name NAME 1 - 16 -
carray carray1 CARRAY1 1 - 10 -
dec_t decimal DECIMAL 1 - 9 - #size ignored by viewj/viewj32
注意:
|
fbnameフィールドと nullフィールドは、非依存型Java構造体やC構造体とは関係がなく、JavaやCの VIEWコンパイラには無視されます。これらのフィールドには、プレースホルダーとしてダッシュ(-)などの値を挿入する必要があります。
|
VIEW型バッファをコンパイルするには、引数としてパッケージ名と
VIEW記述ファイルの名前を指定して、viewjコマンドを実行します。出力ファイルはカレント・ディレクトリに作成されます。
viewjコンパイラを使用するには、次のコマンドを入力します。
java weblogic.wtc.jatmi.viewj [options] [package] viewfile
viewj32コンパイラを使用するには、次のコマンドを入力します。
java weblogic.wtc.jatmi.viewj32 [options] [package] viewfile
|
|
|
AssociatedFieldHandlingをtrueに設定する。これにより、 VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合は、その値をsetおよびgetアクセサ・メソッドで使用できます。指定しない場合、 AssociatedFieldHandlingのデフォルト値はfalseです。
JavaBeansの命名規則に従って、setおよびgetアクセサ名を作成します。フィールド名の最初の文字は、setまたはget接頭辞を付加する前に大文字に変更されます。配列フィールドに対する索引の付いたsetアクセサのシグネチャは、デフォルト・シグネチャのvoid setAfield (T value, int index)からvoid setAfield (int index, T value)に変更されます。
VIEW記述ファイルからフィールド名を取得してsetまたはget接頭辞を追加する方法で、setおよびgetアクセサ名を作成します。WebLogic Server 8.1 SP2より前のリリースとの互換性があります。 -bean_namesまたは -compat_namesを指定しない場合、デフォルト値は -compat_namesになります。
Oracle Tuxedoに送信する文字列のエンコードとOracle Tuxedoから受信する文字列のデコードに対して異なるJavaコードを生成する。エンコードのコードでは、各文字列の最後にnull文字を追加します。デコードのコードでは、最初のnull文字を受け取った箇所で各文字列を切り詰めます。
TypedViewのかわりに、TypedViewを拡張した TypedXCommonとして出力クラスを生成するために使用します。
TypedViewのかわりに、TypedViewを拡張した TypedXCTypeとして出力クラスを生成するために使用します。
注意:
|
-compat_namesと -bean_namesは相互に排他的なオプション。
|
|
|
.javaソース・ファイルに含まれるパッケージ名。
例: examples.wtc.atmi.simpview
|
|
|
•
|
VIEWバッファは次のようにしてコンパイルします。
|
java weblogic.wtc.jatmi.viewj -compat_names examples.javaserver.atmi.simpview infoenc
•
|
VIEW32バッファは次のようにしてコンパイルします。
|
java weblogic.wtc.jatmi.viewj32 -compat_names -modify_strings
examples.javaserver.atmi.simpview infoenc
viewjおよび
viewj32コマンドの出力は、
VIEW記述ファイルの各フィールドに対するsetおよびgetアクセサ・メソッドが含まれた.javaソース・ファイルになります。
VIEWバッファとの間で情報を受け渡すには、Javaアプリケーションでこれらのsetおよびgetアクセサ・メソッドを使用します。
VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合、その値をsetおよびgetメソッドで使用するかどうかを指定するには、
AssociatedFieldHandlingフラグを使用します。setメソッドは配列フィールドでは数を、stringまたはcarrayフィールドでは長さを設定します。
•
|
配列に対するgetメソッドは、関連する数のフィールド以下のサイズを持つ配列を返します。
|
•
|
文字列とcarrayに対するgetメソッドは、関連する長さのフィールド以下の長さを持つデータを返します。
|
AssociatedFieldHandlingフラグの状態を設定または取得するには、次のいずれかの方法を使用します。
•
|
viewjおよび viewj32コンパイラの -associated_fieldsオプションを使用して、 AssociatedFieldHandlingフラグをtrueに設定します。
|
•
|
Javaアプリケーションでvoid setAssociatedFieldHandling (boolean state)メソッドを呼び出して、 AssociatedFieldHandlingフラグの状態を設定します。
|
•
|
falseの場合、setおよびgetメソッドは長さと数のフィールドを無視します。
|
•
|
trueの場合、 VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合は、その値をsetおよびgetメソッドで使用します。
|
•
|
Javaアプリケーションでboolean getAssociatedFieldHandling()メソッドを呼び出して、 AssociatedFieldHandlingの現在の状態を返します。
|
JATMIアプリケーションでのVIEWバッファの使用方法
JATMIアプリケーションに
VIEWバッファを取り込む際には、次の手順に従います。
1.
|
前述のとおり、アプリケーションの VIEW記述ファイルを作成します。
|
2.
|
前述のとおり、 VIEW記述ファイルをコンパイルします。
|
3.
|
前述のとおり、setおよびgetアクセサ・メソッドを使用して、 VIEWバッファに情報を渡したり、VIEWバッファから情報を受け取ったりします。
|
4.
|
VIEWコンパイラの出力クラスをソース・コードにインポートします。
|
6.
|
コンパイル済Java VIEW記述ファイルの完全修飾クラス名を、Tuxedo Javaサーバー構成の<Resources>セクションに構成します。コンパイル済Java VIEW記述ファイルのクラスは、構成ファイル内の<ClassPath>にも含めてください。
|
<ViewFile32Classes> examples.javaserver.atmi.simpview</ViewFile32Classes>
7.
|
Oracle Tuxedo Javaサーバーを起動します。
|
FML32バッファに対してVIEW32データを追加および取得する方法
ヘルパー・クラスを使用して、FML32バッファに対して
VIEW32データを追加および取得できます。クラス名は
wtc.jatmi.FViewFldです。このクラスを使用することで、プログラマはFML32バッファに対して
VIEW32フィールド・タイプを使用するJATMIベースのアプリケーションを簡単に開発できます。
構成の変更は不要です。引き続き、Tuxedo Javaサーバー構成ファイルの<Resources>セクションにある
ViewFile32Classes属性を使用して、
VIEW32クラスを構成します。
このヘルパー・クラスでは、以下のアクセス・メソッドを使用できます。
•
|
FViewFld (String vname, TypedView32 vdata);
|
•
|
FviewFld (FviewFld to_b_clone);
|
•
|
void setViewName (String vname)
|
•
|
void setViewData (TypedView32 vdata)
|
•
|
void TypedView32 getViewData();
|
リスト4-2
例: TypedFML32バッファに対して埋込みTypedView32バッファを追加および取得する方法
String toConvert = new String("hello world");
TypedFML32 MyData = new TypedFML32(new MyFieldTable());
Long d1 = new Long(1234);
Float d2 = new Float(12.32);
MyView data = new myView();
data.setamount((float)100.96);
data.setstatus((short)3);
vfld = new FviewFld("myView", data);
myData.Fchg(MyFieldTable.FLD0, 0, toConvert);
myData.Fchg(MyFieldTable.FLD1, 0, 1234);
myData.Fchg(MyFieldTable.FLD2, 0, d2);
myData.Fchg(MyFieldTable.myview, 0, vfld);
log("An error occurred putting data into the FML32 buffer. The error is " + fe);
myRtn = myTux.tpcall("FMLVIEW", myData, 0);
} catch(TPReplyException tre) {
TypedFML32 myDataBack = (TypedFML32)myRtn.getReplyBuffer();
myNewString = (String)myDataBack.Fget(MyFieldTable.FLD0, 0);
myNewLong = (Integer)myDataBack.Fget(MyFieldTable.FLD1, 0);
myNewFloat = (Float)myDataBack.Fget(MyFieldTable.FLD2, 0);
vfld = (FviewFld)myDataBack.Fget(MyFieldTable.myview, 0);
view = (myView)vfld.getViewData();
次のコード・リストは、
リスト4-2のサンプルに関連するFML記述(MyFieldTable)の例です。
#name number type flags comments
myview 50 view32 - defined in View description file