MsgId (MQBYTE24)

这是用于区分一条消息和另一条消息的字节字符串。 通常,任何两条消息都不应具有相同的消息标识,尽管队列管理器不允许这样做。 消息标识是消息的永久属性,并且在队列管理器重新启动时持久存在。 由于消息标识是字节字符串而不是字符串,因此当消息从一个队列管理器流向另一个队列管理器时,不会在字符集之间转换消息标识。

对于 MQPUT 和 MQPUT1 调用,如果应用程序指定了 MQMI_NONE 或 MQPMO_NEW_MSG_ID ,那么队列管理器将在放入消息时生成唯一消息标识 1 ,并将其放入随消息一起发送的消息描述符中。 队列管理器还在属于发送应用程序的消息描述符中返回此消息标识。 应用程序可以使用此值来记录有关特定消息的信息,以及响应来自应用程序其他部分的查询。

如果将消息放入主题中,那么队列管理器将根据发布的每条消息的需要生成唯一的消息标识。 如果应用程序指定了 MQPMO_NEW_MSG_ID ,那么队列管理器将生成唯一的消息标识以在输出时返回。 如果应用程序指定 MQMI_NONE ,那么 MQMD 中 MsgId 字段的值在从调用返回时保持不变。

请参阅 MQPMO 选项 (MQLONG) 中 MQPMO_RETAIN 的描述,以获取有关保留发布的更多详细信息。

如果将消息放入分发列表,那么队列管理器将根据需要生成唯一消息标识,但 MQMD 中 MsgId 字段的值在从调用返回时保持不变,即使指定了 MQMI_NONE 或 MQPMO_NEW_MSG_ID 也是如此。 如果应用程序需要知道队列管理器生成的消息标识,那么应用程序必须提供包含 MsgId 字段的 MQPMR 记录。

发送应用程序还可以为消息标识指定 MQMI_NONE 以外的值; 这将停止队列管理器生成唯一消息标识。 正在转发消息的应用程序可以使用此消息来传播原始消息的消息标识。

队列管理器不使用此字段,除非:
  • 生成唯一值 (如果请求) ,如上文所述
  • 向发出消息获取请求的应用程序交付值
  • 将该值复制到它生成的关于此消息的任何报告消息的 CorrelId 字段 (取决于 Report 选项)

当队列管理器或消息通道代理生成报告消息时,它会以原始消息的 Report 字段 (MQRO_NEW_MSG_ID 或 MQRO_PASS_MSG_ID) 指定的方式设置 MsgId 字段。 生成报告消息的应用程序也必须执行此操作。

对于 MQGET 调用, MsgId 是可用于从队列中检索特定消息的五个字段之一。 通常, MQGET 调用会返回队列中的下一条消息,但可以通过指定五个选择标准中的一个或多个条件 (任意组合) 来获取特定消息; 这些字段为:
  • MsgId
  • CorrelId
  • GroupId
  • MsgSeqNumber
  • Offset
应用程序将这些字段中的一个或多个字段设置为必需值,然后在 MQGMO 中的 MatchOptions 字段中设置相应的 MQMO_ * 匹配选项以将这些字段用作选择标准。 只有在这些字段中具有指定值的消息才是要检索的候选项。 MatchOptions 字段 (如果未被应用程序改变) 的缺省值是同时匹配消息标识和相关标识。

z/OS®上,您可以使用的选择标准受用于队列的索引类型的限制。 请参阅 IndexType 队列属性以获取更多详细信息。

通常,返回的消息是队列上满足选择条件的 第一条 消息。 但是,如果指定了 MQGMO_BROWSE_NEXT ,那么返回的消息是满足选择条件的 next 消息; 此消息的扫描将从 跟随 当前光标位置的消息开始。

注: 将按顺序扫描队列以查找满足选择标准的消息,因此检索时间比未指定选择标准时要慢,尤其是如果在找到合适的消息之前必须扫描许多消息。 例外情况如下:
  • [UNIX、Linux、Windows、IBM i]CorrelId 在 64 位 Multiplatforms 版上执行的 MQGET 调用,其中 CorrelId 索引不需要执行真正的顺序扫描。
  • [z/OS]z/OS上的 IndexType 进行的 MQGET 调用。

在这两种情况下,都提高了检索性能。

有关如何在各种情况下使用选择标准的更多信息,请参阅 表 2

将 MQMI_NONE 指定为消息标识与不指定 MQMO_MATCH_MSG_ID (即, 任何 消息标识匹配) 具有相同的效果。

如果在 MQGET 调用的 GetMsgOpts 参数中指定了 MQGMO_MSG_UNDER_CURSOR 选项,那么将忽略此字段。

从 MQGET 调用返回时, MsgId 字段将设置为返回的消息的消息标识 (如果有)。

可以使用以下特殊值:
MQMI_NONE
未指定消息标识。

对于字段的长度,该值为二进制零。

对于 C 编程语言,还定义了常量 MQMI_NONE_ARRAY; 此值与 MQMI_NONE 相同,但是字符数组而不是字符串。

这是 MQGET , MQPUT 和 MQPUT1 调用的输入/输出字段。 此字段的长度由 MQ_MSG_ID_LENGTH 给出。 此字段的初始值为 MQMI_NONE。

1 队列管理器生成的 MsgId 由 4 字节产品标识 (ASCII 或 EBCDIC 中的 AMQ ¬ 或 CSQ ¬ ,其中 ¬ 表示空白字符) 组成,后跟特定于产品的唯一字符串实现。 在 IBM® MQ 中,这包含队列管理器名称的前 12 个字符,以及从系统时钟派生的值。 因此,所有可以相互通信的队列管理器都必须具有在前 12 个字符中不同的名称,以确保消息标识是唯一的。 生成唯一字符串的能力还取决于不向后更改系统时钟。 要消除队列管理器生成的消息标识与应用程序生成的消息标识重复的可能性,应用程序必须避免生成具有 ASCII 或 EBCDIC (X'41 '到 X'49' 以及 X'C1'到 X'C9') 范围内的初始字符的标识。 但是,不会阻止应用程序生成具有这些范围中的初始字符的标识。