7 Using FML with Oracle WebLogic Tuxedo Connector
This chapter includes the following sections:
Overview of FML
Note:
See Programming a Tuxedo ATMI Application Using FML at http://docs.oracle.com/cd/E13203_01/tuxedo/tux100/fml/fml01.html
.
FML is a set of java language functions for defining and manipulating storage structures called fielded buffers. Each fielded buffer contains attribute-value pairs in fields. For each field:
-
The attribute is the field's identifier.
-
The associated value represents the field's data content.
-
An occurrence number.
There are two types of FML:
-
FML16 based on 16-bit values for field lengths and identifiers. It is limited to 8191 unique fields, individual field lengths of 64K bytes, and a total fielded buffer size of 64K bytes.
-
FML32 based on 32-bit values for the field lengths and identifiers. It allows for about 30 million fields, and field and buffer lengths of about 2 billion bytes.
Parent topic: Using FML with Oracle WebLogic Tuxedo Connector
The Oracle WebLogic Tuxedo Connector FML API
Note:
The Oracle WebLogic Tuxedo Connector implements a subset of FML functionality. See FML32 Considerations.
The FML application program interface (API) is documented in the weblogic.wtc.jatmi
package included in the Javadocs for WebLogic Server Classes.
Parent topic: Using FML with Oracle WebLogic Tuxedo Connector
FML Field Table Administration
Field tables are generated in a manner similar to Oracle Tuxedo field tables. The field tables are text files that provide the field name definitions, field types, and identification numbers that are common between the two systems. To interoperate with an Oracle Tuxedo system using FML, the following steps are required:
Parent topic: Using FML with Oracle WebLogic Tuxedo Connector
Using the DynRdHdr Property for mkfldclass32 Class
Oracle WebLogic Tuxedo Connector provides a property that provides an alternate method to compile FML tables. You may need to use the DynRdHdr
utility if:
-
You are using very large FML tables and the
.java
method created by themkfldclass32
class exceeds the internal Java Virtual Machine limit on the total complexity of a single class or interface. -
You are using very large FML tables and are unable to load the class created when compiling the
.java
method.
Use the following steps to use the DynRdHdr
property when compiling your FML tables:
-
Convert the field table definition into Java source files.
java -DDynRdHdr=Path_to_Your_FML_Table weblogic.wtc.jatmi.mkfldclass32 userTable
The arguments for this command are defined as follows:
Table 7-1 Argument
Attribute Description -DDynRdHdr
Oracle WebLogic Tuxedo Connector property used to compile an FML table.
Path_to_Your_FML_Table
Path name of your FML table. This may be either a fully qualified path or a relative path that can be found as a resource file using the server's CLASSPATH.
weblogic.wtc.jatmi.mkfldclass32
This class is a utility function that reads an FML32 Field Table and produces a Java file which implements the
FldTbl
interface.userTable
Name of the
.java
method created by themkfldclass32
class. -
Compile the
userTable
file using the following command:javac userTable.java
-
Add the
userTable
.class
file to your application CLASSPATH. -
Update the
WTCResources
MBean to reflect the fully qualified location of theuserTable
.class
file. -
Target your WTC server. The
userTable
.class
is loaded when the WTCServer service starts.
Once you have created the userTable
.class
file, you can modify the FML table and deploy the changes without having to manually create an updated userTable
.class
. When the WTC server is started, Oracle WebLogic Tuxedo Connector will load the updated FML table using the location specified in the Resources tab of your WTC server configuration. If the Path_to_Your_FML_Table
attribute changes, you will need to use the preceding procedure to update your userTable
.java
and userTable
.class
files.
Parent topic: FML Field Table Administration
Using TypedFML32 Constructors
Two new constructors for TypedFML32 are available to improve performance. The following topic provides explanation as to when to use these constructors.
The constructors are defined in the Javadocs for WebLogic Server Classes.
Parent topic: Using FML with Oracle WebLogic Tuxedo Connector
Gaining TypedFML32 Performance Improvements
To gain TypedFML32 performance improvements, you can choose to give size hints to TypedFML32 constructors. There are two parameters that are available to those constructor:
-
A parameter that hints for maximum number of fields. This includes all the occurrences.
-
A parameter for the total number of field IDs used in the buffer.
For instance, a field table used by the buffer contains 20 field IDs, and each field can occur 20 times. In this case, the first parameter should be 400 for the maximum number of fields. The second parameter should be 20 for the total number of field IDs.
TypeFML32 mybuffer = new TypeFML32(400, 20);
Note:
This usually works well with any size of buffer; however, it does not work well with extremely small buffers.
If you have an extremely small buffer, use those constructor without hints. An example of an extremely small buffer is a buffer with less than 16 total occurrences. If the buffer is extremely large, for example contains more than 250000 total field occurrences, then the application should consider splitting it into several buffers smaller than 250000 total field occurrences.
Parent topic: Using TypedFML32 Constructors
tBridge XML/FML32 Translation
Note:
The data type specified must be FLAT or NO. If any other data type is specified, the redirection fails.
The TranslateFML
element of the WTCtBridgeRedirect MBean is used to indicate if FML32 translation is performed on the message payload. There are two types of FML32 translation: FLAT and NO.
FLAT
The message payload is translated using the Oracle WebLogic Tuxedo Connector internal FML32/XML translator. Fields are converted field-by-field values without knowledge of the message structure (hierarchy) and repeated grouping.
In order to convert an FML32 buffer to XML, the tBridge pulls each instance of each field in the FML32 buffer, converts it to a string, and places it within a tag consisting of the field name. All of these fields are placed within a tag consisting of the service name. For example, an FML32 buffer consisting of the following fields:
NAME JOE ADDRESS CENTRAL CITY PRODUCTNAME BOLT PRICE 1.95 PRODUCTNAME SCREW PRICE 2.50
The resulting XML buffer would be:
<FML32> <NAME>JOE</NAME> <ADDRESS>CENTRAL CITY</ADDRESS> <PRODUCTNAME>BOLT</PRODUCTNAME> <PRODUCTNAME>SCREW</PRODUCTNAME> <PRICE>1.95</PRICE> <PRICE>2.50</PRICE> </FML32>
Parent topic: tBridge XML/FML32 Translation
NO
No translation is used.
For JMS to Oracle Tuxedo, the tBridge maps a JMS TextMessage into an Oracle Tuxedo TypedBuffer (TypedString
) and vice versa depending on the direction of the redirection. JMS BytesMessage are mapped into Oracle Tuxedo TypedBuffer (TypedCarray
) and vice versa.
For Oracle Tuxedo to JMS, passing an FML/FML32 buffer behaves as if translateFML
is set to FLAT
. Therefore, in this case, setting translateFML
to NO
has no effect and if the Oracle Tuxedo buffer is of type FML/FML32, the translation takes place automatically.
Parent topic: tBridge XML/FML32 Translation
FML32 Considerations
Remember to consider the following information when working with FML32:
-
For XML input, the root element is required but ignored.
-
For XML output, the root element is always <FML32>.
-
The field table names must be loaded as described in FML Field Table Administration.
-
The tBridge translator is capable of only "flat" or linear grouping. This means that information describing FML32 ordering is not maintained, therefore buffers that contain a series of repeating data could be presented in an unexpected fashion. For example, consider a FML32 buffer that contains a list of parts and their associated price. The expectation would be PART A, PRICE A, PART B, PRICE B, etc. however since there is no structural group information contained within the tBridge, the resulting XML could be PART A, PART B, etc., PRICE A, PRICE B, etc.
-
When translating XML into FML32, the translator ignores
STRING
values. For example,<STRING></STRING>
is skipped in the resulting FML32 buffer. All other types cause WTC to log an error resulting in translation failure. -
Embedded FML is not supported in this release.
-
Embedded VIEW fields within FML32 buffers are supported in this release.
-
TypedCArray is supported for FML/FML32 to XML conversion. Select from the following list of supported field types:
-
SHORT
-
LONG
-
CHAR
-
FLOAT
-
DOUBLE
-
STRING
-
CARRAY
-
INT (FML32)
-
DECIMAL (FML32)
-
-
If you need to pass binary data, encode to a field type of your choice and decode the XML on the receiving side.
-
If you need to use CARRAY fields in an XML input buffer, you must first encode the content using base64. You must decode the base64 data after it is received and before it is processed by an application.
Parent topic: tBridge XML/FML32 Translation
Using the XmlFmlCnv Class for XML to and From FML/FML32 Translation
An alternative option to using the tBridge to automatically translate XML buffers to and from FML/FML32 is to use the XmlFmlCnv
class which supports ordering, grouping and beautifying functionality. The following code listing is an example that uses the XmlFmlCnv
class for conversion to and from XML buffer formats.
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); } }
See Class XmlFmlCnv.
MBSTRING Usage
A TypedMBString
object can be used almost identically as a TypedString
object in a WTC application code. The only difference is that TypedMBString
has a codeset encoding name associated to the string data.
This section includes the following topics.
- Sending MBSTRING Data to an Oracle Tuxedo Domain
- Receiving MBSTRING Data from an Oracle Tuxedo Domain
- Using FML with Oracle WebLogic Tuxedo Connector
Parent topic: Using FML with Oracle WebLogic Tuxedo Connector
Sending MBSTRING Data to an Oracle Tuxedo Domain
When an Oracle Tuxedo message that contains an MBSTRING data is sent to another Oracle Tuxedo domain, TypedMBString
uses the conversion function of java.lang.String
class to convert between Unicode and an external encoding. The TypedMBString
has a codeset encoding name associated to the string data.
When a TypedMBString
object is created by a WTC application code, the encoding name is set to null. The null value of the encoding name means that the default encoding name is used for Unicode string to byte array conversion while sending the MBSTRING data to a remote domain. By default, the Java's default encoding name for byte array string is used for the default encoding name.You can specify encoding or accept the default encoding. The following order defines the order of precedence for TypedMBString
.
-
Specify the encoding name by
setMBEncoding()
method. -
Specify the encoding name through the
setDefaultMBEncoding()
method ofweblogic.wtc.jatmi.MBEncoding
class. -
Specify the encoding name through the
RemoteMBEncoding
attribute of theWTCResourcesMBean
. -
MBENCODINGPROPERTY
system property value. -
Accept the Java default encoding name.
Parent topic: MBSTRING Usage
Receiving MBSTRING Data from an Oracle Tuxedo Domain
When an Oracle Tuxedo message that contains an MBSTRING data is received from a remote domain, the following actions take place.
-
WTC determines the encoding of the MBSTRING data by the codeset
tcm
in the received message. -
WTC creates a
TypedMBString
object.A
TypedMBString
object can be used almost identically as aTyepdString
object in WTC application code. However, the TypedMBString has a codeset encoding name associated to the string data. -
WTC passes the
TypedMBString
object to the WTC application code. The application code knows the encoding of the received MBSTRING data by the instance methodgetMBEncoding()
.
Parent topic: MBSTRING Usage
Using FML with Oracle WebLogic Tuxedo Connector
FLD_MBSTRING is a field type added to TypedFML32
. In this case, a TypedMBString
object is passed to the TypedFML32
method as the associated object type of FLD_MBSTRING. You can specify the encoding name used for the MBSTRING conversion for a FLD_MBSTRING field.
The following order defines the order of precedence for TypedFML32.
Parent topic: MBSTRING Usage