如何填充消息树

消息树最初由消息流的输入节点填充。

当输入节点接收输入消息时,它创建 Properties 树(消息树的第一个子树)并将此与在消息流中配置的节点属性一起植入。然后,它检查输入消息位流的内容并创建消息树的余数来反映那些内容。此过程取决于输入节点本身的一些扩展数据块,它们由通过其接收消息的传输管理:

WebSphere MQ 企业传输方式、 和 WebSphere MQ 遥感传输方式 协议
如果应用程序通过这些协议与代理通信,并且消息流包含相应的 MQInput、 或 SCADAInput 节点,则收到的所有消息都必须以消息队列消息描述符(MQMD)头开始。如果在消息的开始不存在有效的 MQMD,则拒绝消息并且不发生任何进一步处理。

输入节点先调用 MQMD 解析器并为该头创建子树。

在消息的 MQMD 后面可以有零个或多个其他头,这些头链接在一起,一个头的 Format 字段定义后面一个头的格式,直到(包括)最后一个头(该头定义消息体的格式)。如果在该链中有 MQRFH 和 MQRFH2 头,则这两个头中任何一个的名称/值数据还可以包含关于后面数据的格式的信息。如果在 Format 字段中指定的值是可识别的解析器,则它总是优先于名称/值数据。

代理按照消息中的以下链,调用相应的解析器来解释每个头。对每个头都独立进行解析。单个头内的字段按解析器管理的顺序解析。您无法预测或依靠所选择的顺序,但解析字段的顺序不影响在头内出现的字段的顺序。

代理确保消息体前的头的完整性得到维护。消息每一部分的格式由紧接的前面一个头中的 Format 字段(如果后面的部分是可以识别的 WebSphere MQ 格式)或 MQRFH 或 MQRFH2 头中设置的值定义:

  • 第一个头的格式是已知的,因为它必须是 MQMD。
  • 消息中任何后继头的格式在前面头中的 Format 字段中设置。
  • 体的格式与消息域和必须为此消息体(例如,XML)调用的解析器相应。此信息在 MQRFH 或 MQRFH2 头中设置,或在接收此消息的输入节点的消息域属性中设置。

这一过程的重复次数由消息体前面头的数量决定。您无需自己植入这些字段;代理会为您处理这一序列。

代理完成此过程以确保头中的 Format 字段正确地标识消息的每个部分。如果代理不这样做,WebSphere MQ 可能无法传递该消息。因为消息体解析器不是可识别的 WebSphere MQ 头格式,所以代理将以值 MQFMT_NONE 替换最后一个头 Format 字段中的这个值。该字段中的原始值存储在 MQRFH 或 MQRFH2 头内的 Domain(域)字段中,以保留关于消息体内容的信息。如果没有 MQRFH 或 MQRFH2,则信息存储在 Properties 树中。

例如,如果 MQRFH2 头紧接在消息体前面,且它的 Format 字段设置为 XML,表明消息体必须由通用 XML 解析器进行解析,MQRFH2 Domain 字段设置为 XML,且其 Format 字段重置成 MQFMT_NONE。

这些操作可能会导致 ESQL 表达式明确存储的信息由代理所替换。

当已经分析完所有头,并且在消息树内创建了相应的子树时,输入节点将指定的解析器与消息体关联起来。您必须指定要与消息体内容关联的解析器。您可以在消息的头中执行此操作(例如 MQRFH2 头中的 <mcd> 文件夹,一般建议这样做),或在输入节点属性中执行此操作(如果消息不包括头,则建议这种方法)。如下所述,输入节点将进行以下关联:

  • 如果消息具有 MQRFH 或 MQRFH2 头,则头中标识的域(在 Format 或名称/值数据中)确定与此消息关联的解析器。

    SCADAInput 节点从侦听器在 TCP/IP 端口上接收的输入消息创建带有 MQRFH2 头的 WebSphere MQ 格式消息。

  • 如果消息没有 MQRFH 或 MQRFH2 头,或头没有标识域,但存储在 Properties 树中的输入节点的属性表明消息的域,则使用由输入节点属性指定的解析器。您可以指定用户定义的解析器。
  • 如果无法由头值或输入节点的属性标识消息域,则将此消息作为二进制对象(BLOB)来处理。BLOB 解析器与消息关联。BLOB 可以被解释成十六进制字符组成的字符串,可以通过指定字符串子集的位置,在消息流中修改或检查。

由于性能原因,将不对消息体进行解析;可能消息流配置不需要解析消息体。只有在消息流中引用消息体的内容时,才会解析它。

例如,当引用 Root.XML.Field(或 Compute 节点中的 InputRoot.XML.Field)或 Root.MRM.Field 时,解析消息体。取决于消息流中采用的路径,此解析会在不同的时间发生。这种“当首次需要时进行解析”的方法也称为“部分解析”,在正常处理时不会影响消息流的逻辑。但是,如处理消息流中的错误中所述,有些错误处理方案隐含假设。

如果您想要让消息流接收来自多个消息域的消息,您可在消息中包含 MQRFH2 头,从此处输入节点抽取消息域和相关消息定义信息(集 、类型和格式)。

如果设置消息头或输入节点属性以标识用户定义的解析器,则它解释消息和构造逻辑树的方法可能与在此描述的方法有所不同。

WebSphere MQ 多点广播传输方式WebSphere MQ 实时传输方式WebSphere MQ Web Services 传输方式 协议
如果应用程序通过这些受支持协议与代理进行通信,并且消息流包含相应的 Real-timeInput、HTTPInput 或 HTTPRequest 节点,则接收到的消息不必包含特殊的头。您的应用程序可以包含 MQRFH2 头来提供与消息相关的信息,例如,有关发布内容和预订内容的信息)。如果包括可识别的头,则输入节点调用相应的解析器来解释 头并构建消息树的相关部分,如对其他受支持的协议所述。

如果没有头,或这些头不指定用于消息体的解析器,则必须设置输入节点属性来定义消息体解析器。如果没有这样做,则消息作为 BLOB 处理。您可以指定用户定义的解析器。

输入节点将指定的解析器与消息体关联(使用对WebSphere MQ 企业传输方式WebSphere MQ 移动传输方式WebSphere MQ 遥感传输方式 协议相同的方法),但不解析消息体。

如果设置消息头或输入节点属性以标识用户定义的解析器,则它解释消息和构造逻辑树的方法可能与在此描述的方法有所不同。

所有其他协议
如果您希望消息流接受来自 WebSphere Message Broker 不提供内置支持的传输协议的消息,或希望它在接收消息时提供一些特定的处理,请使用 Java 或 C 语言编程接口来创建新的用户定义的输入节点。

该接口不自动为消息生成 Properties 子树(该子树在消息树结构中讨论)。不要求消息一定要具有 Properties 子树,尽管您可能会发现创建一个 Properties 子树使消息树结构一致(不考虑输入节点)十分有用。如果您希望在消息树内创建一个 Properties 子树,并且您正在使用用户定义的输入节点,则必须自己创建它。

如果需要处理不符合任何已定义的消息域的消息,您可以使用 C 语言编程接口来创建一个新的用户定义的解析器。

请参阅节点接口来了解它如何使用解析器,以及是否可以配置它来修改其行为。如果节点使用用户定义的解析器,则为消息创建的树结构可能与为内置解析器创建的树结构稍有不同。 用户定义的输入节点可以完整地解析输入消息,或可以参与部分解析(仅当需要时才解析消息体)。

您也可以使用 C 或 Java 创建您自己的输出和消息处理节点。

相关概念
逻辑树结构
消息树结构
环境树结构
LocalEnvironment 树结构
ExceptionList 树结构
部分解析
相关名
相关任务
处理消息流中的错误
开发消息流
相关参考
内置节点
用户定义的节点
MQRFH2 头
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac18520_