级别: 中级 Shailesh K. Mishra (shailekm@in.ibm.com), 软件工程师, IBM Venkat A. Reddy (venkatre@in.ibm.com), 软件工程师, IBM
2006 年 8 月 02 日 本文介绍了如何在运行于 IBM WebSphere Process Server Version 6 的 IBM WebSphere Adapters Version 6 中实现自定义数据绑定和自定义函数选择器。通过实现自定义数据绑定,可以按照您所需的方式对传入数据和传出数据进行转换,并向 WebSphere Business Adapters 加入数据转换功能。本文是为开发人员编写的,您可以利用本文和其他技术资源来对随 WebSphere Business Adapters 提供的缺省数据绑定进行自定义,并向 Adapters 添加数据转换功能。
为了编写新数据绑定,并将其添加到 Adapters 中,您应该对 WebSphere Business Adapters 有很好的了解。服务组件体系结构(Service Component Architecture,SCA)和服务数据对象(Service Data Object,SDO)方面的知识也将有所帮助。
引言
数据绑定可将企业信息服务(Enterprise Information Service,EIS)服务产生的数据转换为服务组件体系结构 (SCA) 组件能够使用的数据,反之亦然。可以使用数据绑定在入站流中将二进制数据转换为服务数据对象 (SDO) 数据结构,并在出站流中将 SDO 转换为二进制数据。由于缺乏供 IBM® WebSphere® Adapters Version 6(以下称为 Adapters)和其他边缘组件使用的通用数据转换服务,因此存在一个功能空白。例如,Flat File Adapter 不知道其处理的文件的内容,因此将文件内容作为二进制数组进行处理。
IBM® WebSphere® Process Server 中用于 Adapters 的缺省数据绑定并不会对通过 Adapter 特定的 SDO 传入和传出的内容进行数据转换,因此存在由于缺乏通用数据转换而造成的空白。通过实现自定义数据绑定,可以按照您所需的方式对传入数据进行转换。
本文中的信息适用于任何技术的适配器,如 Flat File Adapter 就适用数据转换功能,且需要使用此功能。不过,本文中提供的示例均是针对 Flat File Adapter 准备的。
使用自定义数据绑定方法的数据转换解决方案
此部分将说明如何使用自定义数据绑定 方法实现数据转换解决方案。在下面讨论的场景中,对 Flat File Adapter 的缺省数据绑定进行了自定义,以提供转换解决方案。
数据绑定
数据绑定 将 EIS 服务产生的数据映射为 SCA 组件使用的数据,反之亦然。SDO(也称为业务对象——Business Object,BO)是用于 SCA 组件的首选数据格式。因此,使用数据绑定的典型做法是将 EIS 数据(WBI 记录对象)转换为 SDO,反之亦然。数据绑定在 SCA 模块的导入和导出组件中调用。
数据绑定通常由所有 EIS 服务用于与 SDO 的数据转换。数据绑定是提供两个抽象方法的接口:
public DataObject getDataObject throws DataBindingException(),解析 EIS 数据后获得数据对象 (SDO)。此方法在入站流中调用。此方法需要在自定义数据绑定中加以实现,以用于入站数据转换。
public void setDataObject(DataObject arg0) throws DataBindingException(),设置数据对象 (SDO) 序列化为 EIS 数据。此方法在出站流中调用。此方法需要在自定义数据绑定中加以实现,以用于出站数据转换。
函数选择器
FunctionSelector 是一个简单接口,具有一个 generateEISFunctionName 方法,用于接收传入消息,并返回本机方法的名称。generateEISFunctionName 如下所示:
String generateEISFunctionName (Object[] object):
缺省函数选择器是一个代码片段,与以下所示类似。请注意,为了提高代码可读性,删除了异常处理部分的代码:
public class MyFunctionSelector implements FunctionSelector {
public String generateEISFunctionName(Object[] arg0) throws SelectorException {
Message aMessage = (Message)arg0[0];
String targetFunction = aMessage.getStringProperty("TargetFunctionName");
return targetFunction; // will return null if it is not set
}
}
|
交互关系图
此部分介绍 Flat File Adapter 的交互关系图。此交互关系图可帮助我们了解为了提供转换解决方案而需要进行的修改。
图 1. 交互关系图
这些构件(所有配置都存储在其中)位于 .export/.import 和 .wsdl 文件中。有关示例 .export/.import 和 .wsdl 构件,请参阅附录 E 和附录 F。请注意,下文是根据附录 E 和附录 F(其中对上述序列关系图进行了说明)撰写的:
- Adapter 基类将 Adapter 特定的 Record 对象发送到函数选择器。函数选择器返回一个 NativeMethodName 值。我们可以使用缺省函数选择器进行数据绑定调用,或实现自定义函数选择器。在附录 A 中提供了缺省函数选择器的示例,而附录 B 提供了自定义函数选择器的示例。函数选择器示例配置(在附录 A 中)如下所示:
<connection type="com.ibm.j2ca.flatfile.FlatFileActivationSpec" selectorType=
"com.ibm.j2ca.extension.emd.runtime.WBICustomFunctionSelectorImpl"> |
- Adapter 基类确定从 .export/.import 文件映射的 InterfaceMethodName 的 NativeMethodName。我们需要在 .export/.import 文件中配置 InterfaceMethodName 的 NativeMethodName。示例的 NativeMethodName 将与附录 E 的 .export 文件中的 emitDeltaFlatFile 类似,如下所示:"<methodBinding method="READ" nativeMethod="emitDeltaFlatFile"/>"。此处的 InterfaceMethodName 为 READ。
<esbBinding xsi:type="eis:EISExportBinding" dataBindingType=
"com.test.flat.CustomTransformerDataBindingImpl"> |
- Adapter 基类将对端点调用
InterfaceMethodName 方法。此处的 InterfaceMethodName 为 READ。READ 是对端点调用的方法。
实现自定义数据绑定的主要步骤
- 配置 EIS Import/Export,以使用自定义数据绑定。将在下面的部分中对此进行更为详细的说明。
- 更改 Web 服务定义语言(Web Service Definition Language,WSDL)接口描述,以处理转换后的数据对象。
- 如果需要,请实现一个自定义函数选择器。
- 通过扩展缺省数据绑定类来实现自定义数据绑定类。
- 重写
getDataObject() 和 setDataObject() 方法。
- 这两个方法分别将
WBIRecord 转换为 DataObjects 及进行反向转换。
附录 C 中提供了自定义数据绑定的示例代码。
- 在服务器类路径中包括数据绑定 JAR 文件。
运行时。必须在服务器类路径中包括数据绑定 jar 文件。完成此任务的一种方法是将数据绑定 jar 文件放入到 <WPS_HOME>\lib 文件夹中。将 JAR 文件放入到此文件夹后,需要重新启动服务器。
配置 EIS export/import 使用自定义数据绑定
使用 EMD 工具为 Flat File Adapter 生成 EIS export。以下所示的关系图显示了某个 EIS Export 的属性。修改 Data type 属性,以使用 Custom Data Binding 类。以下是一个示例屏幕截图,其中数据绑定名称为 CustomTransformerDataBindingImpl。
图 2. 数据绑定屏幕截图
实现自定义函数选择器
方法绑定 通过将事件方法(本机方法)映射到接口方法来选择要绑定的“方法”。事件方法信息是由函数选择器提供的。由于要调用自定义接口方法,因此需要使用自定义函数选择器。
附录 B 显示了一个自定义函数选择器的示例代码。为了使用自定义函数选择器,请对 .import 或 .export 文件进行相应的编辑。目前没有提供用于修改所使用的自定义选择器的方法。因此,唯一的方法是手动编辑 .import 和 .export 文件。
附录 D 提供了 .export 文件的一个示例,该文件已经进行了修改,以便使用自定义函数选择器。
结束语
本文提供了一些有用的信息,以帮助您为 WebSphere Process Server 上运行的适配器实现自定义数据绑定和自定义函数选择器。为了达到此目的,您只需要扩展两个类 WBIDataBindingImpl 和 WBIFunctionSelectorImpl,并对 .import 和 .export 文件进行修改即可。通过实现自定义数据绑定和自定义函数选择器,可以自由地向适配器添加数据转换功能。
附录
附录 A:缺省函数选择器
附录 B:自定义函数选择器
附录 C:XML_Order 的入站自定义 EIS 数据绑定(请注意下面的 getDataObject() 实现):
附录 C:XML_Order 的入站自定义 EIS 数据绑定(续)
附录 C:XML_Order 的入站自定义 EIS 数据绑定(续)
附录 D:XML_Order 的出站自定义 EIS 数据绑定(请注意下面的 setDataObject() 实现):
附录 D:XML_Order 的出站自定义 EIS 数据绑定(续)
附录 D:XML_Order 的出站自定义 EIS 数据绑定(续)
附录 E:入站操作的自定义 export 文件定义
以下是一个示例 .export 文件。粗体显示的区域表示为了采用自定义函数选择器而需要进行的示例更改
<?xml version="1.0" encoding="UTF-8"?>
<scdl:export xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eis=
"http://www.ibm.com/xmlns/prod/websphere/scdl/eis/6.0.0" xmlns:ns1=
"http://FFInbound0926/com/test/flat/FlatFileInboundInterface" xmlns:scdl=
"http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" xmlns:wsdl=
"http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" displayName=
"FlatFileInboundInterface" name=
"com/test/flat/FlatFileInboundInterface" target=
"TransformedComponent">
<interfaces>
<interface xsi:type="wsdl:WSDLPortType" portType=
"ns1:FlatFileInboundInterface">
<method name="READ"/>
</interface>
</interfaces>
<esbBindingxsi:type="eis:EISExportBinding"
dataBindingType=
"com.test.flat.CustomTransformerDataBindingImpl">
<resourceAdapter name=
"FFInbound0926App.IBM WebSphere Adapter for Flat Files" type=
"com.ibm.j2ca.flatfile.FlatFileResourceAdapter">
<properties/>
</resourceAdapter>
<connection type="com.ibm.j2ca.flatfile.FlatFileActivationSpec"
selectorType=
"com.ibm.j2ca.extension.emd.runtime.WBICustomFunctionSelectorImpl">
<properties>
<BONamespace>http://www.ibm.com/xmlns/prod/websphere/j2ca/flatfile</BONamespace>
<archiveDirectory>C:\FlatFiles\ArchiveDir</archiveDirectory>
<eventDirectory>C:\FlatFiles\EventDir</eventDirectory>
</properties>
</connection>
<methodBinding method="READ" nativeMethod="emitDeltaFlatFile"/>
<methodBinding method="Customer" nativeMethod=
"emitDeltaCustomer"/>
<methodBinding method=
"PurchaseOrder" nativeMethod="emitDeltaPurchaseOrder"/>
</esbBinding>
</scdl:export>
|
图 3. WSDL 屏幕截图
附录 F:自定义 import 文件定义和出站操作 WSDL 屏幕截图
<?xml version="1.0" encoding="UTF-8"?>
<scdl:import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eis=
"http://www.ibm.com/xmlns/prod/websphere/scdl/eis/6.0.0" xmlns:ns1=
"http://FlatFileOutboundModule/FlatFileOutboundFolder/FlatFileOutboundInterface"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" xmlns:wsdl=
"http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" displayName=
"FlatFileOutboundInterface" name=
"FlatFileOutboundFolder/FlatFileOutboundInterface">
<interfaces>
<interface xsi:type="wsdl:WSDLPortType" portType=
"ns1:FlatFileOutboundInterface">
<method name="create"/>
<method name="append"/>
<method name="retrieve"/>
<method name="delete"/>
<method name="overwrite"/>
<method name="exists"/>
<method name="list"/>
</interface>
</interfaces>
<esbBinding xsi:type="eis:EISImportBinding" dataBindingType=
"com.test.flat. CustomTransformerDataBindingImplTransformerDataBindingImpl">
<resourceAdapter name=
"FlatFileOutboundModuleApp.IBM WebSphere Adapter for Flat Files" type=
"com.ibm.j2ca.flatfile.FlatFileResourceAdapter">
<properties>
<logFileSize>1000000000</logFileSize>
<logFilename>log.txt</logFilename>
<logNumberOfFiles>10</logNumberOfFiles>
<traceFileSize>1000000000</traceFileSize>
<traceFilename>trace.txt</traceFilename>
<traceNumberOfFiles>10</traceNumberOfFiles>
</properties>
</resourceAdapter>
<connection type=
"com.ibm.j2ca.flatfile.FlatFileManagedConnectionFactory" interactionType=
"com.ibm.j2ca.flatfile.FlatFileInteractionSpec">
<properties>
<outputDirectory>C:\jtextdir\outputdir</outputDirectory>
<outputFileName>test.out</outputFileName>
</properties>
</connection>
<methodBinding method="create">
<interaction>
<properties>
<functionName>CREATE</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="append">
<interaction>
<properties>
<functionName>APPEND</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="retrieve">
<interaction>
<properties>
<functionName>RETRIEVE</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="delete">
<interaction>
<properties>
<functionName>DELETE</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="overwrite">
<interaction>
<properties>
<functionName>OVERWRITE</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="exists">
<interaction>
<properties>
<functionName>EXISTS</functionName>
</properties>
</interaction>
</methodBinding>
<methodBinding method="list">
<interaction>
<properties>
<functionName>LIST</functionName>
</properties>
</interaction>
</methodBinding>
</esbBinding>
</scdl:import>
|
图 4. 出站的示例 WSDL 屏幕截图(请注意 create Type 已进行了更改,以反映自定义 SDO。自定义 SDO 为 SampleNameBOBG)
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample xsds for this article | 0606_mishra-BO.zip | 6KB |
FTP |
|---|
| Sample code for this article | 0606_mishra-code.zip | 5KB |
FTP |
|---|
参考资料 学习
讨论
作者简介  | |  | Shailesh K. Mishra 是位于印度古尔加翁的 India Software Lab 的一位软件工程师。他从事了近两年的 Adapters QA 工作,目前正在进行 BizPortlets 方面的工作。您可以通过 shailekm@in.ibm.com 与 Shailesh 联系。
|
 | |  | Venkat A. Reddy 是位于印度古尔加翁的 India Software Lab 的一位高级软件工程师。Venkat 在从事 WebSphere Business Integration Adapters 的开发工作,拥有两项专利,并发表过一篇论文。您可以通过 venkatre@in.ibm.com 与 Venkat 联系。 |
对本文的评价
|