获取特定消息

可通过多种方法从队列中获取特定消息。 包括选择 MsgId 和 CorrelId、选择 GroupId、MsgSeqNumber 和 Offset 以及选择 MsgToken。 还可以在打开队列时使用选择字符串。

要从队列获取特定消息,请使用 MQMD 结构的 MsgIdCorrelId 字段。 但是,应用程序可明确设置这些字段,因此指定的值可能不能识别唯一的消息。 表 1 显示了针对这些字段的可能设置检索的消息。 如果在 MQGET 调用的 GetMsgOpts 参数中指定 MQGMO_MSG_UNDER_CURSOR,那么输入上将忽略这些字段。
表 1. 使用消息和相关标识
要检索... MsgId CorrelId
队列中的第一条消息 MQMI_NONE MQCI_NONE
MsgId 匹配的第一条消息 非零 MQCI_NONE
CorrelId 匹配的第一条消息 MQMI_NONE 非零
MsgIdCorrelId 匹配的第一条消息 非零 非零

在每种情况下,第一条均指符合选择标准的第一条消息(除非指定 MQGMO_BROWSE_NEXT,此时指序列中符合选择标准的下一条消息)。

返回时,MQGET 调用会将 MsgIdCorrelId 字段设置为所返回的消息的消息和相关标识(如有)。

如果将 MQMD 结构的 Version 字段设置为 2,那么可使用 GroupIdMsgSeqNumberOffset 字段。 表 2 显示了针对这些字段的可能设置检索的消息。
表 2. 使用组标识
要检索... 匹配选项
队列中的第一条消息 MQMO_NONE
MsgId 匹配的第一条消息 MQMO_MATCH_MSG_ID
CorrelId 匹配的第一条消息 MQMO_MATCH_CORREL_ID
GroupId 匹配的第一条消息 MQMO_MATCH_GROUP_ID
MsgSeqNumber 匹配的第一条消息 MQMO_MATCH_MSG_SEQ_NUMBER
MsgToken 匹配的第一条消息 MQMO_MATCH_MSG_TOKEN
Offset 匹配的第一条消息 MQMO_MATCH_OFFSET
注:
  1. MQMO_MATCH_XXX 意味着将 MQMD 结构中的 XXX 字段设置为要匹配的值。
  2. 可组合使用 MQMO 标志。 例如,可同时使用 MQMO_MATCH_GROUP_ID、MQMO_MATCH_MSG_SEQ_NUMBER 和 MQMO_MATCH_OFFSET 提供由 GroupIdMsgSeqNumberOffset 字段标识的段。
  3. 如果指定 MQGMO_LOGICAL_ORDER,那么您尝试检索的消息将受到影响,因为选项取决于为队列句柄控制的状态信息。 有关此信息,请参阅 逻辑和物理排序选项

MQGET 调用通常检索来自队列的第一条消息。 如果在使用 MQGET 调用时指定特定消息,那么队列管理器必须搜索队列直至找到该消息。 这可影响应用程序的性能。

如果使用 V2 或更高版本的 MQGMO 结构,并且未指定 MQMO_MATCH_MSG_ID 或 MQMO_MATCH_CORREL_ID 标志,那么无需在 MQGET 间重置 MsgIdCorrelId 字段。

[z/OS]IBM® MQ for z/OS®上,可以使用队列属性 IndexType 来提高队列上 MQGET 操作的速度。 有关更多信息,请参阅 索引类型

可通过在 MQGMO 结构中指定消息的 MsgToken 和 MatchOption MQMO_MATCH_MSG_TOKEN,从队列中获取特定的消息。 除非重新启动队列管理器,否则 MsgToken 将由最初将此消息放入队列的 MQPUT 调用或先前的 MQGET 操作返回并保持不变。

如果您仅对队列上的一部分消息感兴趣,可通过将选择字符串用于 MQOPEN 或 MQSUB 调用,来指定要处理的消息。 然后,MQGET 会检索满足选择字符串要求的下一条消息。 有关选择字符串的更多信息,请参阅 选择器