Oracle® Fusion Middleware Oracle WebLogic Server Tuxedo Connector プログラマーズ ガイド 11g リリース 1 (10.3.1) B55532-01 |
|
戻る |
次へ |
以下の節では、フィールド操作言語 (FML) の概要と Oracle WebLogic Tuxedo Connector が FML を使用する方法について説明します。
注意 : FML の使用方法については、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/fml/fml01.html の「FML プログラミング入門」を参照してください。 |
FML は、フィールド バッファと呼ばれる記憶構造を定義および操作する Java 言語機能のセットです。各フィールド バッファには、フィールドに属性および値の組み合わせが含まれています。各フィールドは次のように構成されます。
属性はフィールドの識別子である。
関連する値はフィールドのデータ内容を示す。
オカレンス番号。
FML には、2 つのタイプがあります。
フィールド長および識別子に 16 ビット値を使用する FML16。ユニークなフィールド数が 8191、個々のフィールド長が 64K バイト、フィールド バッファの合計サイズが 64K バイトに制限されています。
フィールド長および識別子に 32 ビット値を使用する FML32。約 3 千万のフィールド、約 20 億バイトのフィールド長およびバッファ長が使用できます。
FML アプリケーション プログラム インタフェース (API) は、WebLogic Server クラスの Javadoc に含まれている weblogic.wtc.jatmi
パッケージにドキュメント化されています。
フィールド テーブルは、Oracle Tuxedo フィールド テーブルに似た方法で生成されます。フィールド テーブルは、2 つのシステム間で共通のフィールド名定義、フィールド タイプ、および識別番号を提供するテキスト ファイルです。FML を使用して Oracle Tuxedo システムと相互運用するには、次の手順を実行する必要があります。
Oracle Tuxedo システムから Oracle WebLogic Tuxedo Connector 環境に、フィールド テーブルをコピーします。
次に例を示します。Oracle Tuxedo 配布キットには、bankapp
という銀行アプリケーション サンプルが含まれています。このアプリケーションには、次の構造を持つ bankflds
というファイルがあります。
#Copyright (c) 1990 Unix System Laboratories, Inc. #All rights reserved #ident "@(#) apps/bankapp/bankflds $Revision: 1.3 $" # Fields for database bankdb # name number type flags comments ACCOUNT_ID 110 long - - ACCT_TYPE 112 char - - ADDRESS 109 string - - . . .
フィールド テーブル定義を Java ソース ファイルに変換します。weblogic.wtc.jatmi
パッケージの mkfldclass
ユーティリティを使用します。このクラスは、FML32 フィールド テーブルを読み取るユーティリティ機能で、FldTbl インタフェースを実装する Java ファイルを生成します。このユーティリティには、次のような 2 つのインスタンスがあります。
mkfldclass
mkfldclass32
コマンドの正しいインスタンスを使用して、bankflds
フィールド テーブルを FML32 Java ソースに変換します。次は、mkfldclass を使用した例です。
java weblogic.wtc.jatmi.mkfldclass bankflds
作成されたファイルは bankflds.java
となり、次のような構造を持ちます。
import java.io.*; import java.lang.*; import java.util.*; 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 */ . . .
次のコマンドを使用して、作成した bankflds.java
ファイルをコンパイルします。
javac bankflds.java
コンパイルすると、bankflds.class
ファイルとなります。ロード時、Oracle WebLogic Tuxedo Connector はクラス ファイルを使用して FML32 フィールドからフィールド エントリを追加、検索、および削除します。
フィールド テーブルのクラス ファイルをアプリケーション CLASSPATH に追加します。
WTCServer
MBean を更新します。
フィールド テーブルのクラス ファイルの完全に修飾された場所を反映するため、WTCResources
MBean を更新します。
fml16 または fml32 の FML バッファ タイプを記述するために必要なキーワードを使用します。
カンマ区切りのリストに、複数のフィールド テーブル クラスを入力できます。
次に例を示します。
<wtc-resources> <name>BankappResources</name> <fld-tbl16-class>my.bankflds</fld-tbl16-class> <fld-tbl16-class>your.bankflds</fld-tbl16-class> <fld-tbl16-class>more.bankflds</fld-tbl16-class> </wtc-resources>
フィールド テーブルのクラス定義をロードするために、Oracle WebLogic Server を再起動します。
Oracle WebLogic Tuxedo Connector には、FML テーブルを別の方法でコンパイルするためのプロパティが提供されています。以下の場合には、DynRdHdr
ユーティリティを使用する必要があります。
非常に大きな FML テーブルを使用しているので、mkfldclass32 クラスで作成された .java
メソッドが、単一のクラスまたはインタフェースの全体的な複雑度に関する内部 Java 仮想マシンの制限を超える。
非常に大きな FML テーブルを使用しているので、.java
メソッドをコンパイルして作成されたクラスをロードできない。
FML テーブルをコンパイルする場合には、次の手順で DynRdHdr
プロパティを使用します。
フィールド テーブル定義を Java ソース ファイルに変換します。
java -DDynRdHdr=Path_to_Your_FML_Table weblogic.wtc.jatmi.mkfldclass32 userTable
このコマンドの引数の定義は次のとおりです。
属性 | 説明 |
---|---|
-DDynRdHdr |
FML テーブルをコンパイルするための Oracle WebLogic Tuxedo Connector プロパティ。 |
Path_to_Your_FML_Table
|
FML テーブルのパス名。サーバの CLASSPATH でリソース ファイルとして検索可能な絶対パスまたは相対パスを指定する。 |
weblogic.wtc.jatmi.mkfldclass32 |
このクラスは、FML32 フィールド テーブルを読み取るユーティリティ機能で、FldTbl インタフェースを実装する Java ファイルを生成する。 |
userTable |
mkfldclass32 クラスによって作成される .java メソッドの名前。 |
次のコマンドを使用して、userTable
ファイルをコンパイルします。
javac userTable.java
userTable
.class
ファイルをアプリケーション CLASSPATH に追加します。
userTable
.class
ファイルの完全に修飾された場所を反映するため、WTCResources
MBean を更新します。
WTCServer を対象とします。WTCServer サービスが開始されるときに、userTable
.class
がロードされます。
userTable
.class
ファイルの作成後は、userTable
.class
を手動で更新しなくても FML テーブルを変更してその変更をデプロイすることができます。WTC サービスの開始時に、Oracle WebLogic Tuxedo Connector は、WTC サービス コンフィグレーションの [リソース] タブで指定された場所を使用して更新済みの FML テーブルをロードします。Path_to_Your_FML_Table
属性を変更した場合、前の手順に従って userTable
.java
および userTable
.class
ファイルを更新する必要があります。
2 つの新しい TypedFML32 コンストラクタを使用すると、パフォーマンスが向上します。これらのコンストラクタの使用については、以下を参照してください。
コンストラクタは、WebLogic クラスの Javadoc に定義されます。
TypedFML32 でパフォーマンスの向上を実現するためには、TypedFML32 コンストラクタにサイズ ヒントを指定します。これらのコンストラクタで利用できるパラメータは、以下の 2 つです。
フィールドの最大数のヒントを指定するパラメータ。すべての発生数を指定します。
バッファで使用されるフィールド ID の総数を指定するパラメータ。
たとえば、バッファで使用されるフィールド テーブルに 20 個のフィールド ID を格納し、各フィールドを 20 回発生させることができます。その場合は、最初のパラメータにフィールドの最大数 400 を指定し、2 番目のパラメータにフィールド ID の総数 20 を指定する必要があります。
TypeFML32 mybuffer = new TypeFML32(400, 20);
注意 : 通常、バッファのサイズに制限はありませんが、非常に小さいサイズでは、うまく機能しません。 |
非常に小さいバッファを使用する場合は、これらのコンストラクタをヒントなしで使用します。非常に小さいバッファとは、たとえば、フィールドの総発生回数が 16 より小さいバッファを指します。たとえば、フィールドの総発生回数が 250,000 を超える非常に大きいバッファの場合は、アプリケーションでフィールドの総発生回数 250,000 より小さいバッファに分割することを検討する必要があります。
注意 : 指定するデータ型は、FLAT または NO にする必要があります。他のデータ型を指定すると、リダイレクションは失敗します。 |
WTCtBridgeRedirect MBean の TranslateFML
要素は、FML32 変換がメッセージ ペイロードで実行されることを示すために使用します。FML32 変換には、FLAT および NO の 2 つのタイプがあります。
メッセージ ペイロードは、Oracle WebLogic Tuxedo Connector の内部 FML32/XML トランスレータを使用して変換されます。フィールドは、メッセージ構造 (階層構造) を意識せず、グループ化を反復せずに、フィールドごとの値に変換されます。
FML32 バッファを XML に変換するため、tBridge は FML32 バッファにある各フィールドの各インスタンスを抽出して文字列に変換し、それをフィールド名で構成されるタグ内に配置します。これらすべてのフィールドは、サービス名で構成されるタグ内に配置されます。たとえば、次のフィールドで構成される FML32 バッファがあるとします。
NAME JOE ADDRESS CENTRAL CITY PRODUCTNAME BOLT PRICE 1.95 PRODUCTNAME SCREW PRICE 2.50
変換された XML バッファは次のようになります。
<FML32> <NAME>JOE</NAME> <ADDRESS>CENTRAL CITY</ADDRESS> <PRODUCTNAME>BOLT</PRODUCTNAME> <PRODUCTNAME>SCREW</PRODUCTNAME> <PRICE>1.95</PRICE> <PRICE>2.50</PRICE> </FML32>
変換は使用されません。
JMS から Oracle Tuxedo の場合、tBridge は、リダイレクションの方向に応じて、JMS TextMessage を Oracle Tuxedo TypedBuffer (TypedString) に (またはその逆に) マップします。JMS BytesMessage は、Oracle Tuxedo TypedBuffer (TypedCarray) に (またはその逆に) マップされます。
Oracle Tuxedo から JMS の場合、FML/FML32 バッファの受け渡しは、translateFML
が FLAT
に設定されているように動作します。したがって、この場合は、translateFML
を NO
に設定しても効果はありません。Oracle Tuxedo バッファが FML/FML32 型の場合、変換が自動的に実行されます。
FML32 を使用する場合は、以下の情報について考慮する必要があります。
XML 入力では、ルート要素が必要だが無視される。
XML 出力では、ルート要素は常に FML32。
フィールド テーブル名は、「FML フィールド テーブルの管理」で説明されているようにロードする必要があります。
tBridge トランスレータは、「flat」またはリニアなグループ化でのみ有効。これは FML32 順を記述する情報が管理されないために、繰り返しデータを含むバッファが予期しない形式で示される場合があります。たとえば、部品とそれに関連付けられた価格のリストを含む FML32 バッファがあると仮定します。ここでは PART A、PRICE A、PART B、PRICE B などが予想されますが、tBridge 内に構造的なグループ情報がないため、変換された XML は PART A、PART B など、PRICE A、PRICE B などになります。
XML を FML32 に変換する場合、トランスレータは STRING
値を無視する。たとえば、<STRING></STRING>
は、結果的に FML32 バッファではスキップされます。他のすべての型の場合、WTC では変換エラーとなるエラーがログに記録されます。
組み込み FML は、このリリースではサポートされない。
FML32 バッファ内の組み込み VIEW フィールドは、このリリースではサポートされている。
FML/FML32 から XML への変換で、TypedCArray はサポートされている。以下のサポートされているフィールド型から選択してください。
SHORT
LONG
CHAR
FLOAT
DOUBLE
STRING
CARRAY
INT (FML32)
DECIMAL (FML32)
バイナリ データを渡す必要がある場合、選択したフィールド型にエンコードし、受け取り側で XML をデコードする。
XML 入力バッファで CARRAY フィールドを使用する場合は、最初に base64 を使用してコンテンツをエンコードする必要がある。base64 でエンコードされたデータのデコードは、データが受信された後、かつデータがアプリケーションによって処理される前に実行する必要があります。
tBridge を使用して XML バッファと FML/FML32 の間の変換を自動的に行う代わりに、順序指定、グループ化、および整形機能を備えた XmlFmlCnv
クラスを使用することもできます。次のコードは、XML バッファ フォーマットとの間での変換に XmlFmlCnv
クラスを使用する例です。
import weblogic.wtc.jatmi.TypedFML32; import weblogic.wtc.jatmi.FldTbl; import weblogic.wtc.gwt.XmlFmlCnv; public class xml2fml { public static void main(String[] args) { String xmlDoc = "<XML><MyString>hello</MyString></XML>"; TypedFML32 fmlBuffer = new TypedFML32(new MyFieldTable()); XmlFmlCnv c = new XmlFmlCnv(); fmlBuffer = c.XMLtoFML32(xmlDoc, fmlBuffer.getFieldTables()); String result = c.FML32toXML(fmlBuffer); System.out.println(result); } }
「Class XmlFmlCnv」を参照してください。
TypedMBString
オブジェクトは、WTC アプリケーション コードで TypedString
オブジェクトとほとんど同じように使用できます。ただ、TypedMBString
には文字列データに関連付けられたコードセット エンコーディング名がある点だけが異なります。
この節の内容は以下のとおりです。
MBSTRING データを含む Oracle Tuxedo メッセージが別の Oracle Tuxedo ドメインに送信されるときに、TypedMBString
は java.lang.String
クラスの変換関数を使用して Unicode と外部エンコーディングの間の変換を行います。TypedMBString
には文字列データに関連付けられたコードセット エンコーディング名があります。
WTC アプリケーション コードでの TypedMBString
オブジェクトの作成時には、エンコーディング名は null に設定されます。エンコーディング名が null 値の場合、MBSTRING データをリモート ドメインに送信するときに、Unicode 文字列のバイト配列への変換にはデフォルトのエンコーディング名が使用されます。デフォルトでは、バイト配列文字列に対する Java のデフォルト エンコーディング名がデフォルト エンコーディング名として使用されます。エンコーディングを指定することも、デフォルト エンコーディングをそのまま使用することもできます。次の順序は、TypedMBString
に対する優先順位を示しています。
setMBEncoding()
メソッドでエンコーディング名を指定する。
weblogic.wtc.jatmi.MBEncoding
クラスの setDefaultMBEncoding()
メソッドを使用してエンコーディング名を指定する。
WTCResourcesMBean
の RemoteMBEncoding
属性を使用してエンコーディング名を指定する。
MBENCODINGPROPERTY
システム プロパティ値。
Java のデフォルト エンコーディング名をそのまま使用する。
リモート ドメインから MBSTRING データを含む Oracle Tuxedo メッセージが受信されると、以下のアクションが発生します。
WTC は、受信したメッセージのコードセット tcm
から MBSTRING データのエンコーディングを判別する。
WTC は、TypedMBString
オブジェクトを作成する。
TypedMBString
オブジェクトは、WTC アプリケーション コードで TypedString
オブジェクトとほとんど同じように使用できます。ただし、TypedMBString には文字列データに関連付けられたコードセット エンコーディング名があります。
WTC は、TypedMBString
オブジェクトを WTC アプリケーション コードに渡す。アプリケーション コードは、インスタンス メソッド getMBEncoding()
を使用して、受信した MBSTRING データのエンコーディングを認識します。
TypedFML32
に FLD_MBSTRING フィールド型が追加されています。この場合、FLD_MBSTRING の関連付けられたオブジェクト型として TypedMBString
オブジェクトが TypedFML32
メソッドに渡されます。FLD_MBSTRING フィールドの MBSTRING 変換に使用するエンコーディング名を指定できます。
次の順序は、TypedFML32 に対する優先順位を示しています。
フィールドの TypedMBString オブジェクトの setMBEncoding()
メソッドでエンコーディング名を指定する。
TypedFML32 オブジェクトの setMBEncoding()
メソッドでエンコーディング名を指定する。
weblogic.wtc.jatmi.MBEncoding
クラスの setDefaultMBEncoding()
メソッドを使用してエンコーディング名を指定する。
WTCResourcesMBean
の RemoteMBEncoding
属性を使用してエンコーディング名を指定する。
MBENCODINGPROPERTY
システム プロパティ値。
Java のデフォルト エンコーディング名をそのまま使用する。
注意 : 以下のメソッドFldtype() 、Fchg() 、Fadd() 、Fget() 、および Fdel() は、FLD_MBSTRING の使用時に更新する必要があります。
Oracle Tuxedo で必要な |