プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server Oracle WebLogic Tuxedo Connectorアプリケーションの開発
12c (12.2.1.3.0)
E90367-01
目次へ移動
目次

前
次

7 Oracle WebLogic Tuxedo ConnectorでのFMLの使用

この章では、Oracle WebLogic Tuxedo ConnectorはField Manipulation Language (FML)を使用する方法について説明します。

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

FMLの概要

注意:

http://docs.oracle.com/cd/E13203_01/tuxedo/tux100/fml/fml01.htmlにある、FMLを使用したTuxedo ATMIアプリケーションのプログラミングを参照してください。

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

  • 属性はフィールドの識別子です。

  • 関連する値はフィールドのデータ内容を示します。

  • オカレンス番号。

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

  • フィールド長および識別子に16ビット値を使用するFML16。一意のフィールド数が8191、個々のフィールド長が64Kバイト、フィールド・バッファの合計サイズが64Kバイトに制限されています。

  • フィールド長および識別子に32ビット値を使用するFML32。約3千万のフィールド、約20億バイトのフィールド長およびバッファ長が使用できます。

Oracle WebLogic Tuxedo Connector FML API

注意:

Oracle WebLogic Tuxedo Connectorは、FML機能のサブセットを実装しています。「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. WTCサーバーをターゲットに設定します。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では不要です。