转载

使用 Mapping 节点转换 SOAP 消息

简介

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 消息报文结构

使用 Mapping 节点转换 SOAP 消息

消息组成模块选择

在 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. 修改输入对象包括的消息模块

使用 Mapping 节点转换 SOAP 消息

图 3. 消息模块添加或删除对话框

使用 Mapping 节点转换 SOAP 消息

回页首

映射节点设计考虑要素

映射节点使用图形化的方式编程,输入对象和输出对象之间的映射关系使用分层的方式组织,使得输入对象和输出对象之间元素的复制和处理非常简单。特别是处理复杂元素时,一些特别技巧将简化复杂元素之间的映射,本文将继续讨论其中一些使用频率较高的技巧。

技巧之一:映射覆盖 (Override)

当复制一个复杂类型元素值到输出对象时,如果需要修改复杂类型元素的一些子元素的值,可以使用映射覆盖组 (override group)。如图 4'映射覆盖操作提示',最经常的应用场景如,输出对象往往需要使用输入对象的消息属性,但是有可能对其中某个子元素的值进行修改,如字符集 (CodedCharSetId), 其具体步骤如下:

  1. 右键单击字符集元素 (CodedCharSetId),选择操作'分配 (Assign)', 在操作对应属性'通用 (General)'中设置要分配给字符集元素的值。
  2. 单击操作'分配 (Assign)'左上角的黄色小灯图标,将会打开修改提示,图 4 ‘映射覆盖操作提示’中第一个为生成映射覆盖组,单击确认。
  3. 映射节点将会将消息属性元素 (Properties) 之前的操作'Move'和其子元素字符集的操作'分配 (Assign)'生成一个覆盖组,如图 5 ‘映射覆盖组’所示。这表示输入对象的消息属性元素值将会全部复制到输出对象的消息属性中,但是其中子元素字符集的值将被操作'分配 (Assign)'设置的新的值所更新覆盖。

图 4. 映射覆盖操作提示

使用 Mapping 节点转换 SOAP 消息

图 5. 映射覆盖组

使用 Mapping 节点转换 SOAP 消息

技巧之二:类型强制转换 (Cast)

映射节点支持对通配符元素 xsd:any 和通配符属性 xsd:anyAttribute 的强制类型转换: 用户可以指定转换的目标类型,或者将通配符元素或者属性作为子映射的输入或输出,在子映射中可以定义将输入输出定义为特定类型。图 6 ‘类型强制转换菜单’展示如何从本地环境树中获得所需变量,其具体步骤如下:

  1. 如图 3 ‘消息模块添加或删除对话框’中勾选‘ LocalEnviornment', 在输入对象中显示本地环境树。
  2. 如图 6 ‘类型强制转换菜单’,展开本地环境树,右键单击 Variables 元素的子元素通配符元素 any, 在打开的菜单中选择 cast
  3. 在打开的类型选择对话框中,将出现应用命名空间中所有的元素,选择目标元素,图 7 ‘类型选择对话框’中本文选择元素'AdditionalInfo'. 这一元素是类型为'String'的简单元素。其中本地环境树'AddtionalInfo'的值由映射节点的上游节点传入,例如 ESQL 计算节点。计算节点需要将属性的'基本'中'计算模式'设置为包含'本地环境'。示例代码如代码清单 1 设置环境树变量:
  4. 转换结果如图 8 ‘类型强制转换’ 所示

清单 1. 设置环境树变量

SET OutputLocalEnvironment.Variables.AdditionalInfo = 'Customized Info';

图 6. 类型强制转换菜单

使用 Mapping 节点转换 SOAP 消息

图 7. 类型选择对话框

使用 Mapping 节点转换 SOAP 消息

图 8. 强制类型转换

使用 Mapping 节点转换 SOAP 消息

强制类型转换也可以用于派生类型元素。如图 9 ‘类型关系示例’所示,元素类型'UKAddress'和'USAAdress'都以元素类型'Address'为父类型。图 10 ‘派生类型强制转换’中的消息映射使用强制类型转换功能将父类型转换为派生子类型。在实际应用中可以根据实际消息类型直接使用派生的子类型或者使用 If-else 选择功能决定在输出对象中使用哪个子类型的值。如图 11 ‘使用条件选择子类型’,本示例根据元素'Name'的值决定输入对象的元素类型为派生子类的'UKAddress'或者'USAAdress'。

图 9. 类型关系示例

使用 Mapping 节点转换 SOAP 消息

图 10. 派生类型强制转换

使用 Mapping 节点转换 SOAP 消息

图 11. 使用条件选择子类型

使用 Mapping 节点转换 SOAP 消息

技巧之三:子映射

在映射节点中的复杂元素之间的转换缺省使用本地映射 (Local map),但是如果需要做到这对元素之间映射关系的重用,可以使用子映射 (submap)。本地映射和子映射的区别在于子映射将映射关系存储为一个单独的映射文件 (*.map),使得此映射关系可以在多个映射节点中得到重用。

子映射可以直接创建,或者从本地映射转换。

  1. 在直接创建时,将映射关系设置为'子映射',(如图 12 ‘创建子映射’)。在属性中点击'New'(如图 13 ‘创建子映射文件’,图 14 ‘生成子映射文件’),可以创建新的子映射 map 文件,其设置和生成和普通映射文件相同。
  2. 从本地映射转换时,如图 15 ‘重构本地映射为子映射’所示,右键单击本地映射 (Local map),从菜单中选择'重构为子映射'(Refactor to Submap), 将会把本地映射转换成子映射文件。

图 12. 创建子映射

使用 Mapping 节点转换 SOAP 消息

图 13. 创建子映射文件

使用 Mapping 节点转换 SOAP 消息

图 14. 生成子映射文件

使用 Mapping 节点转换 SOAP 消息

图 15. 重构本地映射为子映射

使用 Mapping 节点转换 SOAP 消息

回页首

映射节点问题诊断

映射节点将运行情况作为事件写入用户事件跟踪记录 (user trace events) 中。用户跟踪事件包括映射的所有相关元素的输入和产生的输出,以及发生的错误。

用户跟踪事件启动命令如下:

  1. mqsichangetrace <Broker> -u -e <EG name> -l debug -r -c 100000
  2. Recreate the problem.
  3. mqsichangetrace <Broker> -u -e <EG name> -l none
  4. mqsireadlog <Broker> -u -e <EG name> -f -o trace.xml
  5. mqsiformatlog -i trace.xml -o trace.txt

声明:本文仅代表作者个人之观点,不代表 IBM 公司之观点。

回页首

总结

本文介绍了 IBM Integration Bus v9 中的重要功能 Mapping 节点对 SOAP 的协议支持,以及相关使用和配置技巧。

正文到此结束
Loading...