MQMDE 概述

可用性: 所有 IBM® MQ 系统以及连接到这些系统的 IBM MQ 客户机。

用途:MQMDE 结构描述有时发生在应用程序消息数据之前的数据。 该结构包含 version-2 MQMD 中存在但 version-1 MQMD 中不存在的那些 MQMD 字段。

格式名:MQFMT_MD_EXTENSION。

字符集和编码:MQMDE 中的数据必须采用本地队列管理器的字符集和编码; 这些数据由 C 编程语言的 CodedCharSetId queue-manager 属性和 MQENC_NATIVE 提供。

将 MQMDE 的字符集和编码设置到 CodedCharSetIdEncoding 字段中:
  • MQMD (如果 MQMDE 结构位于消息数据的开头) ,或者
  • MQMDE 结构之前的头结构 (所有其他情况)。

如果 MQMDE 不在队列管理器的字符集和编码中,那么将接受但不接受 MQMDE ,即将 MQMDE 视为消息数据。

注:Windows上,使用 Micro Focus COBOL 编译的应用程序使用不同于队列管理器编码的 MQENC_NATIVE 值。 虽然 MQPUT , MQPUT1和 MQGET 调用上的 MQMD 结构中的数字字段必须采用 Micro Focus COBOL 编码,但 MQMDE 结构中的数字字段必须采用队列管理器的编码。 后者由 MQENC_NATIVE 为 C 编程语言提供,并且具有值 546。
用法: 使用 version-2 MQMD 的应用程序不会迂到 MQMDE 结构。 但是,专用应用程序以及继续使用 version-1 MQMD 的应用程序在某些情况下可能会迂到 MQMDE。 MQMDE 结构可能在以下情况下发生:
  • 在 MQPUT 和 MQPUT1 调用上指定
  • MQGET 调用返回
  • 在传输队列上的消息中
MQPUT 和 MQPUT1 调用: 在 MQPUT 和 MQPUT1 调用上,如果应用程序提供 version-1 MQMD ,那么应用程序可以选择使用 MQMDE 作为消息数据的前缀,将 MQMD 中的 Format 字段设置为 MQFMT_MD_EXTENSION 以指示存在 MQMDE。 如果应用程序未提供 MQMDE ,那么队列管理器将为 MQMDE 中的字段采用缺省值。 队列管理器使用的缺省值与结构的初始值相同; 请参阅 表 1
如果应用程序提供了 version-2 MQMD ,并且 以 MQMDE 作为应用程序消息数据的前缀,那么将处理结构,如 表 1中所示。
表 1. 在 MQPUT 或 MQPUT1 上为 MQMDE 指定 MQMDE 时的队列管理器操作
MQMD 版本 version-2 字段的值 MQMDE 中相应字段的值 队列管理器执行的操作
1 - 有效 已采用 MQMDE
2 缺省 有效 已采用 MQMDE
2 不是缺省值 有效 MQMDE 被视为消息数据
第 1 年或第 2 年 任意 无效 调用失败,并带有相应的原因码
第 1 年或第 2 年 任意 MQMDE 的字符集或编码错误,或者是不受支持的版本 MQMDE 被视为消息数据
注:z/OS®上,如果应用程序指定具有 MQMDE 的 version-1 MQMD ,那么仅当队列的 IndexType 为 MQIT_GROUP_ID 时,队列管理器才会验证 MQMDE。

有一个特殊情况。 如果应用程序使用 version-2 MQMD 来放置作为段的消息 (即,设置了 MQMF_SEGMENT 或 MQMF_LAST_SEGMENT 标志) ,并且 MQMD 中的格式名称为 MQFMT_DEAD_LETTER_HEADER ,那么队列管理器会生成 MQMDE 结构,并将其 插入到 MQDLH 结构及其后的数据之间。 在队列管理器随消息保留的 MQMD 中, version-2 字段设置为其缺省值。

version-2 MQMD 中存在但不存在 version-1 MQMD 的多个字段是 MQPUT 和 MQPUT1上的输入/输出字段。 但是,在 MQPUT 和 MQPUT1 调用的输出中,队列管理器 不会 返回 MQMDE 中等效字段中的任何值; 如果应用程序需要这些输出值,那么它必须使用 version-2 MQMD。

MQGET 调用返回的 MQMDE: 在 MQGET 调用上,如果应用程序提供了 version-1 MQMD ,那么队列管理器会将 MQMDE 返回的消息作为前缀,但前提是 MQMDE 中的一个或多个字段具有非缺省值。 队列管理器将 MQMD 中的 Format 字段设置为值 MQFMT_MD_EXTENSION ,以指示存在 MQMDE。

如果应用程序在 Buffer 参数启动时提供 MQMDE ,那么将忽略 MQMDE。 从 MQGET 调用返回时,会将其替换为消息的 MQMDE (如果需要) 或由应用程序消息数据覆盖 (如果不需要 MQMDE)。

如果 MQGET 调用返回 MQMDE ,那么 MQMDE 中的数据通常采用队列管理器的字符集和编码。 但是,在下列情况下, MQMDE 可能使用其他某个字符集和编码:
  • MQMDE 被视为 MQPUT 或 MQPUT1 调用上的数据 (请参阅 表 1 以了解可能导致此情况的情况)。
  • 从通过 TCP 连接连接的远程队列管理器接收到消息,并且未正确设置接收消息通道代理程序 (MCA)。
注:Windows上,使用 Micro Focus COBOL 编译的应用程序使用不同于队列管理器编码的 MQENC_NATIVE 值 (请参阅上文)。

传输队列上的消息中的 MQMDE: 传输队列上的消息以 MQXQH 结构为前缀,其中包含 version-1 MQMD。 MQMDE 也可能存在,位于 MQXQH 结构和应用程序消息数据之间,但通常仅当 MQMDE 中的一个或多个字段具有非缺省值时才存在。

其他 MQ 头结构也可以出现在 MQXQH 结构与应用程序消息数据之间。 例如,当死信头 MQDLH 存在且消息不是段时,顺序为:
  • MQXQH (包含 version-1 MQMD)
  • MQMDE
  • MQDLH
  • 应用程序消息数据