转自bea.com
将 FML 用于 WebLogic Tuxedo Connector
以下部分讨论字段控制语言(Field Manipulation Language,简称 FML)并描述 WebLogic Tuxedo Connector 如何使用 FML。
FML 概述
注意: | 有关使用 FML 的详细信息,请参阅 Programming a BEA Tuxedo Application Using FML。 |
FML 是一组 Java 语言函数,用来定义和操作称为字段缓冲区的存储结构。每个字段缓冲区都在字段中包含特性-值对。对于每个字段:
WebLogic Tuxedo Connector FML API
注意: | WebLogic Tuxedo Connector 实现部分 FML 功能。有关 FML32 的详细信息,请参阅 FML32 注意事项。 |
FML 应用程序编程接口(Application Program Interface,简称 API)记录在 Javadocs for WebLogic Server Classes 中的 weblogic.wtc.jatmi
包中。
FML 字段表管理
字段表的生成方式类似于 Tuxedo 字段表。字段表是提供字段名定义、字段类型以及共用于两个系统中的标识号的文本文件。要使用 FML 与 Tuxedo 系统进行互操作,需要执行下列步骤:
bankapp
的银行应用程序示例。它包含一个名为bankflds
的文件,该文件具有以下结构:#Copyright (c) 1990 Unix System Laboratories, Inc.
#All rights reserved
#ident "@(#) apps/bankapp/bankflds $Revision: 1.3 ___FCKpd___0quot;
# Fields for database bankdb# name number type flags comments
ACCOUNT_ID 110 long - -
ACCT_TYPE 112 char - -
ADDRESS 109 string - -
..
.
weblogic.wtc.jatmi
包中提供的mkfldclass
实用工具。此类是读取 FML32 字段表的实用工具函数,可以生成实现 FldTbl 接口的 Java 文件。此实用工具有两个实例: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
文件。进行加载后,WebLogic Tuxedo Connector 便可以使用该类文件在 FML32 字段中添加、检索和删除字段条目。WTCServer
MBean。WTCResources
MBean 以反映字段表类文件的完全限定位置。-
<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>
使用 mkfldclass32 类的 DynRdHdr 属性
WebLogic Tuxedo Connector 提供一个属性,该属性提供另一种编译 FML 表的方法。如果符合下列情况,则可能需要使用 DynRdHdr
实用工具:
使用下列步骤可在编译 FML 表时使用 DynRdHdr
属性:
创建 userTable
.class
文件后,可以修改 FML 表并部署更改,而不必手工创建更新的 userTable
.class
。启动 WTC 服务时,WebLogic Tuxedo Connector 将使用 WTC 服务配置的“资源”选项卡中指定的位置加载更新的 FML 表。如果 Path_to_Your_FML_Table 特性更改,则需要使用前一过程来更新 userTable
.java
和 userTable
.class
文件。
使用 TypedFML32 构造方法
有两个新的 TypedFML32 构造方法可用来提高性能。以下主题提供有关何时使用这些构造方法的说明。
构造方法是在 Javadocs for WebLogic Server Classes 中定义的。
获得 TypedFML32 性能提高
要获得 TypedFML32 性能提高,可以选择对 TypedFML32 构造方法提供大小提示。有两个参数可用于这些构造方法:
例如,缓冲区使用的一个字段表包含 20 个字段 ID,每个字段可出现 20 次。在此例中,第一个参数应为 400,用于表示最大字段数。第二个参数应为 20,用于表示字段 ID 总数。
TypeFML32 mybuffer = new TypeFML32(400, 20);
注意: | 对于任何大小的缓冲区,这通常都能正常工作;但是,对于极小的缓冲区,这无法正常工作。 |
如果您有极小的缓冲区,请不带提示使用这些构造方法。总出现次数少于 16 的缓冲区是极小缓冲区的一个示例。如果缓冲区极大,例如包含的总字段出现次数多于 250000,则应用程序应考虑将其拆分为几个总字段出现数小于 250000 的缓冲区。
tBridge XML/FML32 转换
注意: | 指定的数据类型必须是 FLAT 或 NO。如果指定任何其他数据类型,则重定向将失败。 |
WTCtBridgeRedirect MBean 的 TranslateFML
元素用于表明是否对消息负载执行 FML32 转换。有两种 FML32 转换类型:FLAT 和 NO。
FLAT
消息负载是使用 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
<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 到 Tuxedo,tBridge 将 JMS TextMessage 映射到 Tuxedo TypedBuffer (TypedString) 中,反之亦然,具体情况取决于重定向的方向。JMS BytesMessage 被映射到 Tuxedo TypedBuffer (TypedCarray) 中,反之亦然。
对于从 Tuxedo 到 JMS,传递 FML/FML32 缓冲区的表现就好像将 translateFML
设置为了 FLAT
的表现。因此,在这种情况下,将 translateFML
设置为 NO
没有任何效果,并且如果 Tuxedo 缓冲区的类型为 FML/FML32,则转换会自动发生。
FML32 注意事项
STRING
值。例如,在生成的 FML32 缓冲区中将跳过<STRING></STRING>
。所有其他类型都将导致 WTC 记录一个错误,并导致转换失败。
使用 XmlFmlCnv 类进行 XML 到和从 FML/FML32 的转换
使用 tBridge 将 XML 缓冲区自动转换为 FML/FML32 和从 FML/FML32 自动转换为 XML 缓冲区的另一种选择是使用 XmlFmlCnv
类,该类支持排序、分组和美化功能。以下代码清单是将 XmlFmlCnv
类用于从 XML 缓冲区格式进行转换和进行到 XML 格式的转换的示例。
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 数据发送到 Tuxedo 域
将包含 MBSTRING 数据的 Tuxedo 消息发送到其他 Tuxedo 域时,TypedMBString
使用 java.lang.String
类的转换函数在 Unicode 和外部编码之间进行转换。TypedMBString
将一个代码集编码名称与字符串数据关联。
如果 TypedMBString
对象由 WTC 应用程序代码创建,则编码名称会设置为 null。编码名称的 null 值表示在向远程域发送 MBSTRING 数据时,将对 Unicode 字符串到字节数组的转换使用默认编码名称。默认情况下,会为默认编码名称使用 Java 的针对字节数组字符串的默认编码名称。可以指定编码或接受默认编码。以下顺序定义 TypedMBString
的优先顺序。
接收来自 Tuxedo 域的 MBSTRING 数据
收到来自远程域的包含 MBSTRING 数据的 Tuxedo 消息时,将执行下列操作。
将 FML 用于 WebLogic Tuxedo Connector
FLD_MBSTRING 是添加到 TypedFML32
中的字段类型。在本例中,TypedMBString
对象是作为 FLD_MBSTRING 的关联对象类型传递到 TypedFML32
方法的。可以指定用于 FLD_MBSTRING 字段的 MBSTRING 转换的编码名称。
注意: | 使用 FLD_MBSTRING 时,必须更新下列方法:Fldtype() 、Fchg() 、Fadd() 、Fget() 和 Fdel() 。 |
注意: | Tuxedo 中需要的按需编码方法和自动转换方法(如 Fmbpack32() 和 Fmbunpack32() )并不被 WebLogic Tuxedo Connector 需要。 |