IIB (IBM Integration Bus, 之前称为 Websphere Message Broker) 是一款企业服务总线 (ESB) 产品,为面向服务架构 (SOA) 环境和非 SOA 环境提供连通性和通用数据转换。现在任何规模的企业都无需再进行点到点连接和批量处理,无论平台、协议或数据格式如何。
图形化映射节点 (Mapping Node) 在 Websphere Message Broker v8 引入,在下一版本 IBM Integration Bus v9 中功能和易用性得到相当提高。映射节点现在可以处理多种域消息,以及整合除消息主体以外的多种消息头和环境变量。本文以对 webservice 常用的 SOAP 消息处理为例,讨论在转换时针对不同实现方式的域的选择,以及多种转换技巧,如复杂元素复制时的子元素覆盖,继承元素的转换,子映射 (submap) 等。
回页首
映射节点用图形化的方式在输入对象和输出对象进行消息的处理和转换,在初始化和设计时主要考虑三点:1) 输入输出消息域的选择,2) 消息组成模块的选择如 LocalEnvironment, 消息头等,3) 消息中不同元素 (element) 的处理技巧。
标准 EDI 报文是由字段 (segment), 元素 (element) 和子元素分隔符(separator) 分隔的文本文件。EDI 报文是嵌套格式的。一个 EDI 报文中可能嵌套几百个功能组 (Functional Groups), 每个功能组中可能嵌套几千个事务集 (Transaction Set)。
标准嵌套格式如图 1。在 IBM Integration Bus v9 中,映射节点支持如下域:
DFDL
XMLNSC
SOAP
DataObject
BLOB
MRM
本文中我们以处理 web 服务常用的 SOAP 消息为例,讨论映射节点输入输出消息域的选择。
在初始化时映射节点需要选择输入对象和输出对象的域和模型 (Schema Model)。在处理 SOAP 消息时,根据使用的输入节点的不同,输入对象的域以及模型选择将有所不同。具体如表 1 SOAP 消息域以及映射模型选择所示。
表 1. SOAP 消息域以及映射模型选择
输入节点 | 消息域 | 映射时的模型 |
SOAP 节点 | SOAP | SOAP_Domain_Msg |
SOAP 节点包括 SOAPExtract 节点,且 SOAPExtract 节点至于映射节点之前 | XMLNSC | SOAP 服务接口 (Operation) 对应的模型 |
HTTP 节点 | XMLNSC | SOAP1.1 或者 SOAP1.2 模型作为映射节点根模型 (Root model) |
MQ 节点 | XMLNSC | SOAP1.1 或者 SOAP1.2 模型作为映射节点根模型 (Root model) |
表一提供了映射节点在 IBM Integration Bus v9 应用程序需要选择的消息域,但是在集成服务应用 (Integration Service application) 中稍有不同。集成服务应用 的引入简化了 Web Service 的开发,可以自动生成基于 SOAPInput 节点的消息流,并将不同的服务操作路由到不同子流中处理。在集成服务应用的子流中映射节点收到的 SOAP 消息已经去除了 SOAP Envelope, 在初始化时可以选择 XMLNSC 域以及相应的 SOAP 服务接口模型。
需要注意的是,表一中提到 SOAP1.1 和 SOAP1.2 需要有所区别,这是因为不同版本的 SOAP 协议部分消息树的构成是不同的。
SOAP 消息使用 XML 格式编码。如图 1 所示,其结构包括一个 Envelope 元素,Envelope 元素由 Header 元素和 Body 元素组成。Header 元素可选,Body 元素必选。Body 元素中的 Fault 元素用来报告出错信息。对于不同的 SOAP 版本,Fault 元素组成不同。SOAP1.1 中 Fault 元素的子元素为 <faultcode>,<faultstring>,<faultactor>,<detail>。SOAP1.2 中 Fault 元素的子元素为 <Code>,<Reason>,<Node>,<Role>。
图 1. SOAP 1.2 消息报文结构
在 IBM Integration Bus 中,输入节点将收到的数据解析成树结构,其组成模块有:消息树 (Message tree),包括消息属性 (Properties),消息主体 (body),和消息头 (Header); 环境树 (Environment tree); 本地环境树 (Local environment tree),包括目的 (destination) 目录和变量 (Variables) 目录 ; 异常列表树 (Exception list tree)。
IBM Integration Bus v9 中映射节点可以处理消息树和本地环境树,但是不包括环境树和异常列表树。
缺省情况下,映射节点将在输入对象和输出对象中自动包括消息树中的属性 (Properties) 和主体 (Body). 当需要修改输入对象或者输出对象包括的消息模块时,如图 2 ‘修改输入对象包括的消息模块’所示,单击输入或输出 (Message Assembly),在对应属性里面选择 'Headers and folders: Properties'。打开如图 3 ‘消息模块添加或删除’对话框,可以对输入 / 输出包括的消息组件进行修改。
需要注意的是,图 3 中的消息组成模块,如果没有在输出对象中显式包含,映射节点将自动从输入中复制,否则将按照映射节点中的设计对其进行赋值。
图 2. 修改输入对象包括的消息模块
图 3. 消息模块添加或删除对话框
回页首
映射节点使用图形化的方式编程,输入对象和输出对象之间的映射关系使用分层的方式组织,使得输入对象和输出对象之间元素的复制和处理非常简单。特别是处理复杂元素时,一些特别技巧将简化复杂元素之间的映射,本文将继续讨论其中一些使用频率较高的技巧。
当复制一个复杂类型元素值到输出对象时,如果需要修改复杂类型元素的一些子元素的值,可以使用映射覆盖组 (override group)。如图 4'映射覆盖操作提示',最经常的应用场景如,输出对象往往需要使用输入对象的消息属性,但是有可能对其中某个子元素的值进行修改,如字符集 (CodedCharSetId), 其具体步骤如下:
图 4. 映射覆盖操作提示
图 5. 映射覆盖组
映射节点支持对通配符元素 xsd:any 和通配符属性 xsd:anyAttribute 的强制类型转换: 用户可以指定转换的目标类型,或者将通配符元素或者属性作为子映射的输入或输出,在子映射中可以定义将输入输出定义为特定类型。图 6 ‘类型强制转换菜单’展示如何从本地环境树中获得所需变量,其具体步骤如下:
清单 1. 设置环境树变量
SET OutputLocalEnvironment.Variables.AdditionalInfo = 'Customized Info';
图 6. 类型强制转换菜单
图 7. 类型选择对话框
图 8. 强制类型转换
强制类型转换也可以用于派生类型元素。如图 9 ‘类型关系示例’所示,元素类型'UKAddress'和'USAAdress'都以元素类型'Address'为父类型。图 10 ‘派生类型强制转换’中的消息映射使用强制类型转换功能将父类型转换为派生子类型。在实际应用中可以根据实际消息类型直接使用派生的子类型或者使用 If-else 选择功能决定在输出对象中使用哪个子类型的值。如图 11 ‘使用条件选择子类型’,本示例根据元素'Name'的值决定输入对象的元素类型为派生子类的'UKAddress'或者'USAAdress'。
图 9. 类型关系示例
图 10. 派生类型强制转换
图 11. 使用条件选择子类型
在映射节点中的复杂元素之间的转换缺省使用本地映射 (Local map),但是如果需要做到这对元素之间映射关系的重用,可以使用子映射 (submap)。本地映射和子映射的区别在于子映射将映射关系存储为一个单独的映射文件 (*.map),使得此映射关系可以在多个映射节点中得到重用。
子映射可以直接创建,或者从本地映射转换。
图 12. 创建子映射
图 13. 创建子映射文件
图 14. 生成子映射文件
图 15. 重构本地映射为子映射
回页首
映射节点将运行情况作为事件写入用户事件跟踪记录 (user trace events) 中。用户跟踪事件包括映射的所有相关元素的输入和产生的输出,以及发生的错误。
用户跟踪事件启动命令如下:
声明:本文仅代表作者个人之观点,不代表 IBM 公司之观点。
回页首
本文介绍了 IBM Integration Bus v9 中的重要功能 Mapping 节点对 SOAP 的协议支持,以及相关使用和配置技巧。