| Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Tuxedo Connectorプログラマーズ・ガイド 11g リリース1 (10.3.6) B61627-03 |
|
![]() 前 |
![]() 次 |
以下の節では、フィールド操作言語(FML)の概要とOracle WebLogic Tuxedo ConnectorがFMLを使用する方法について説明します。
|
注意: FMLの使用方法については、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/fml/fml01.htmlにある、FMLを使用したTuxedo ATMIアプリケーションのプログラミングのガイドを参照してください。 |
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で必要な |