消息树最初由消息流的输入节点填充。
当输入节点接收输入消息时,它创建 Properties 树(消息树的第一个子树)并将此与在消息流中配置的节点属性一起植入。然后,它检查输入消息位流的内容并创建消息树的余数来反映那些内容。此过程取决于输入节点本身的一些扩展数据块,它们由通过其接收消息的传输管理:
输入节点先调用 MQMD 解析器并为该头创建子树。
在消息的 MQMD 后面可以有零个或多个其他头,这些头链接在一起,一个头的 Format 字段定义后面一个头的格式,直到(包括)最后一个头(该头定义消息体的格式)。如果在该链中有 MQRFH 和 MQRFH2 头,则这两个头中任何一个的名称/值数据还可以包含关于后面数据的格式的信息。如果在 Format 字段中指定的值是可识别的解析器,则它总是优先于名称/值数据。
代理按照消息中的以下链,调用相应的解析器来解释每个头。对每个头都独立进行解析。单个头内的字段按解析器管理的顺序解析。您无法预测或依靠所选择的顺序,但解析字段的顺序不影响在头内出现的字段的顺序。
代理确保消息体前的头的完整性得到维护。消息每一部分的格式由紧接的前面一个头中的 Format 字段(如果后面的部分是可以识别的 WebSphere MQ 格式)或 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> 文件夹,一般建议这样做),或在输入节点属性中执行此操作(如果消息不包括头,则建议这种方法)。如下所述,输入节点将进行以下关联:
SCADAInput 节点从侦听器在 TCP/IP 端口上接收的输入消息创建带有 MQRFH2 头的 WebSphere MQ 格式消息。
由于性能原因,将不对消息体进行解析;可能消息流配置不需要解析消息体。只有在消息流中引用消息体的内容时,才会解析它。
例如,当引用 Root.XML.Field(或 Compute 节点中的 InputRoot.XML.Field)或 Root.MRM.Field 时,解析消息体。取决于消息流中采用的路径,此解析会在不同的时间发生。这种“当首次需要时进行解析”的方法也称为“部分解析”,在正常处理时不会影响消息流的逻辑。但是,如处理消息流中的错误中所述,有些错误处理方案隐含假设。
如果您想要让消息流接收来自多个消息域的消息,您可在消息中包含 MQRFH2 头,从此处输入节点抽取消息域和相关消息定义信息(集 、类型和格式)。
如果设置消息头或输入节点属性以标识用户定义的解析器,则它解释消息和构造逻辑树的方法可能与在此描述的方法有所不同。
如果没有头,或这些头不指定用于消息体的解析器,则必须设置输入节点属性来定义消息体解析器。如果没有这样做,则消息作为 BLOB 处理。您可以指定用户定义的解析器。
输入节点将指定的解析器与消息体关联(使用对WebSphere MQ 企业传输方式、WebSphere MQ 移动传输方式 和 WebSphere MQ 遥感传输方式 协议相同的方法),但不解析消息体。
如果设置消息头或输入节点属性以标识用户定义的解析器,则它解释消息和构造逻辑树的方法可能与在此描述的方法有所不同。
该接口不自动为消息生成 Properties 子树(该子树在消息树结构中讨论)。不要求消息一定要具有 Properties 子树,尽管您可能会发现创建一个 Properties 子树使消息树结构一致(不考虑输入节点)十分有用。如果您希望在消息树内创建一个 Properties 子树,并且您正在使用用户定义的输入节点,则必须自己创建它。
如果需要处理不符合任何已定义的消息域的消息,您可以使用 C 语言编程接口来创建一个新的用户定义的解析器。
请参阅节点接口来了解它如何使用解析器,以及是否可以配置它来修改其行为。如果节点使用用户定义的解析器,则为消息创建的树结构可能与为内置解析器创建的树结构稍有不同。 用户定义的输入节点可以完整地解析输入消息,或可以参与部分解析(仅当需要时才解析消息体)。
您也可以使用 C 或 Java 创建您自己的输出和消息处理节点。