ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Tuxedo Connector プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55532-01
 

目次
目次

戻る
戻る
 
次へ
次へ

7 Oracle WebLogic Tuxedo Connector での FML の使用

以下の節では、フィールド操作言語 (FML) の概要と Oracle WebLogic Tuxedo Connector が FML を使用する方法について説明します。

FML の概要


注意 :

FML の使用方法については、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/fml/fml01.html の「FML プログラミング入門」を参照してください。

FML は、フィールド バッファと呼ばれる記憶構造を定義および操作する Java 言語機能のセットです。各フィールド バッファには、フィールドに属性および値の組み合わせが含まれています。各フィールドは次のように構成されます。

FML には、2 つのタイプがあります。

Oracle WebLogic Tuxedo Connector FML API


注意 :

Oracle WebLogic Tuxedo Connector は、FML 機能のサブセットを実装しています。FML32 の詳細については、「FML32 の考慮事項」を参照してください。

FML アプリケーション プログラム インタフェース (API) は、WebLogic Server クラスの Javadoc に含まれている weblogic.wtc.jatmi パッケージにドキュメント化されています。

FML フィールド テーブルの管理

フィールド テーブルは、Oracle Tuxedo フィールド テーブルに似た方法で生成されます。フィールド テーブルは、2 つのシステム間で共通のフィールド名定義、フィールド タイプ、および識別番号を提供するテキスト ファイルです。FML を使用して Oracle Tuxedo システムと相互運用するには、次の手順を実行する必要があります。

  1. 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  -       -       
    .
    .
    .
    
  2. フィールド テーブル定義を 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 */
    .
    .
    .
    
  3. 次のコマンドを使用して、作成した bankflds.java ファイルをコンパイルします。

    javac bankflds.java
    

    コンパイルすると、bankflds.class ファイルとなります。ロード時、Oracle WebLogic Tuxedo Connector はクラス ファイルを使用して FML32 フィールドからフィールド エントリを追加、検索、および削除します。

  4. フィールド テーブルのクラス ファイルをアプリケーション CLASSPATH に追加します。

  5. 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>
    
  6. フィールド テーブルのクラス定義をロードするために、Oracle WebLogic Server を再起動します。

mkfldclass32 クラスに対する DynRdHdr プロパティの使用

Oracle WebLogic Tuxedo Connector には、FML テーブルを別の方法でコンパイルするためのプロパティが提供されています。以下の場合には、DynRdHdr ユーティリティを使用する必要があります。

  • 非常に大きな FML テーブルを使用しているので、mkfldclass32 クラスで作成された .java メソッドが、単一のクラスまたはインタフェースの全体的な複雑度に関する内部 Java 仮想マシンの制限を超える。

  • 非常に大きな FML テーブルを使用しているので、.java メソッドをコンパイルして作成されたクラスをロードできない。

FML テーブルをコンパイルする場合には、次の手順で DynRdHdr プロパティを使用します。

  1. フィールド テーブル定義を 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 メソッドの名前。

  2. 次のコマンドを使用して、userTable ファイルをコンパイルします。

    javac userTable.java 
    
  3. userTable.class ファイルをアプリケーション CLASSPATH に追加します。

  4. userTable.class ファイルの完全に修飾された場所を反映するため、WTCResources MBean を更新します。

  5. 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 ファイルを更新する必要があります。

TypedFML32 コンストラクタの使用

2 つの新しい TypedFML32 コンストラクタを使用すると、パフォーマンスが向上します。これらのコンストラクタの使用については、以下を参照してください。

コンストラクタは、WebLogic クラスの Javadoc に定義されます。

TypedFML32 でパフォーマンスの向上の実現

TypedFML32 でパフォーマンスの向上を実現するためには、TypedFML32 コンストラクタにサイズ ヒントを指定します。これらのコンストラクタで利用できるパラメータは、以下の 2 つです。

  • フィールドの最大数のヒントを指定するパラメータ。すべての発生数を指定します。

  • バッファで使用されるフィールド ID の総数を指定するパラメータ。

たとえば、バッファで使用されるフィールド テーブルに 20 個のフィールド ID を格納し、各フィールドを 20 回発生させることができます。その場合は、最初のパラメータにフィールドの最大数 400 を指定し、2 番目のパラメータにフィールド ID の総数 20 を指定する必要があります。

TypeFML32 mybuffer = new TypeFML32(400, 20); 

注意 :

通常、バッファのサイズに制限はありませんが、非常に小さいサイズでは、うまく機能しません。

非常に小さいバッファを使用する場合は、これらのコンストラクタをヒントなしで使用します。非常に小さいバッファとは、たとえば、フィールドの総発生回数が 16 より小さいバッファを指します。たとえば、フィールドの総発生回数が 250,000 を超える非常に大きいバッファの場合は、アプリケーションでフィールドの総発生回数 250,000 より小さいバッファに分割することを検討する必要があります。

tBridge XML/FML32 変換


注意 :

指定するデータ型は、FLAT または NO にする必要があります。他のデータ型を指定すると、リダイレクションは失敗します。

WTCtBridgeRedirect MBean の TranslateFML 要素は、FML32 変換がメッセージ ペイロードで実行されることを示すために使用します。FML32 変換には、FLAT および NO の 2 つのタイプがあります。

FLAT

メッセージ ペイロードは、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>

NO

変換は使用されません。

JMS から Oracle Tuxedo の場合、tBridge は、リダイレクションの方向に応じて、JMS TextMessage を Oracle Tuxedo TypedBuffer (TypedString) に (またはその逆に) マップします。JMS BytesMessage は、Oracle Tuxedo TypedBuffer (TypedCarray) に (またはその逆に) マップされます。

Oracle Tuxedo から JMS の場合、FML/FML32 バッファの受け渡しは、translateFMLFLAT に設定されているように動作します。したがって、この場合は、translateFMLNO に設定しても効果はありません。Oracle Tuxedo バッファが FML/FML32 型の場合、変換が自動的に実行されます。

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 でエンコードされたデータのデコードは、データが受信された後、かつデータがアプリケーションによって処理される前に実行する必要があります。

XmlFmlCnv クラスを使用した XML と FML/FML32 間の変換

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」を参照してください。

XmlFmlCnv クラスの制限事項

このリリースの XmlFmlCnv.FML32toXML メソッドでは、FML32 の FLD_MBSTRING フィールドはサポートされていません。

MBSTRING の使い方

TypedMBString オブジェクトは、WTC アプリケーション コードで TypedString オブジェクトとほとんど同じように使用できます。ただ、TypedMBString には文字列データに関連付けられたコードセット エンコーディング名がある点だけが異なります。

この節の内容は以下のとおりです。

MBSTRING データの Oracle Tuxedo ドメインへの送信

MBSTRING データを含む Oracle Tuxedo メッセージが別の Oracle Tuxedo ドメインに送信されるときに、TypedMBStringjava.lang.String クラスの変換関数を使用して Unicode と外部エンコーディングの間の変換を行います。TypedMBString には文字列データに関連付けられたコードセット エンコーディング名があります。

WTC アプリケーション コードでの TypedMBString オブジェクトの作成時には、エンコーディング名は null に設定されます。エンコーディング名が null 値の場合、MBSTRING データをリモート ドメインに送信するときに、Unicode 文字列のバイト配列への変換にはデフォルトのエンコーディング名が使用されます。デフォルトでは、バイト配列文字列に対する Java のデフォルト エンコーディング名がデフォルト エンコーディング名として使用されます。エンコーディングを指定することも、デフォルト エンコーディングをそのまま使用することもできます。次の順序は、TypedMBString に対する優先順位を示しています。

  1. setMBEncoding() メソッドでエンコーディング名を指定する。

  2. weblogic.wtc.jatmi.MBEncoding クラスの setDefaultMBEncoding() メソッドを使用してエンコーディング名を指定する。

  3. WTCResourcesMBeanRemoteMBEncoding 属性を使用してエンコーディング名を指定する。

  4. MBENCODINGPROPERTY システム プロパティ値。

  5. Java のデフォルト エンコーディング名をそのまま使用する。

MBSTRING データの Oracle Tuxedo ドメインからの受信

リモート ドメインから MBSTRING データを含む Oracle Tuxedo メッセージが受信されると、以下のアクションが発生します。

  1. WTC は、受信したメッセージのコードセット tcm から MBSTRING データのエンコーディングを判別する。

  2. WTC は、TypedMBString オブジェクトを作成する。

    TypedMBString オブジェクトは、WTC アプリケーション コードで TypedString オブジェクトとほとんど同じように使用できます。ただし、TypedMBString には文字列データに関連付けられたコードセット エンコーディング名があります。

  3. WTC は、TypedMBString オブジェクトを WTC アプリケーション コードに渡す。アプリケーション コードは、インスタンス メソッド getMBEncoding() を使用して、受信した MBSTRING データのエンコーディングを認識します。

Oracle WebLogic Tuxedo Connector での FML の使用

TypedFML32 に FLD_MBSTRING フィールド型が追加されています。この場合、FLD_MBSTRING の関連付けられたオブジェクト型として TypedMBString オブジェクトが TypedFML32 メソッドに渡されます。FLD_MBSTRING フィールドの MBSTRING 変換に使用するエンコーディング名を指定できます。

次の順序は、TypedFML32 に対する優先順位を示しています。

  1. フィールドの TypedMBString オブジェクトの setMBEncoding() メソッドでエンコーディング名を指定する。

  2. TypedFML32 オブジェクトの setMBEncoding() メソッドでエンコーディング名を指定する。

  3. weblogic.wtc.jatmi.MBEncoding クラスの setDefaultMBEncoding() メソッドを使用してエンコーディング名を指定する。

  4. WTCResourcesMBeanRemoteMBEncoding 属性を使用してエンコーディング名を指定する。

  5. MBENCODINGPROPERTY システム プロパティ値。

  6. Java のデフォルト エンコーディング名をそのまま使用する。


    注意 :

    以下のメソッド Fldtype()Fchg()Fadd()Fget()、および Fdel() は、FLD_MBSTRING の使用時に更新する必要があります。

    Oracle Tuxedo で必要な Fmbpack32() および Fmbunpack32() などのオンデマンド エンコーディング メソッドや自動変換メソッドは、Oracle WebLogic Tuxedo Connector では不要です。