获取特定消息
可通过多种方法从队列中获取特定消息。 包括选择 MsgId 和 CorrelId、选择 GroupId、MsgSeqNumber 和 Offset 以及选择 MsgToken。 还可以在打开队列时使用选择字符串。
要从队列获取特定消息,请使用 MQMD 结构的
MsgId 和 CorrelId 字段。 但是,应用程序可明确设置这些字段,因此指定的值可能不能识别唯一的消息。 表 1 显示了针对这些字段的可能设置检索的消息。 如果在 MQGET 调用的 GetMsgOpts 参数中指定 MQGMO_MSG_UNDER_CURSOR,那么输入上将忽略这些字段。| 要检索... | MsgId |
CorrelId |
|---|---|---|
| 队列中的第一条消息 | MQMI_NONE |
MQCI_NONE |
与 MsgId 匹配的第一条消息 |
非零 | MQCI_NONE |
与 CorrelId 匹配的第一条消息 |
MQMI_NONE |
非零 |
与 MsgId 和 CorrelId 匹配的第一条消息 |
非零 | 非零 |
在每种情况下,第一条均指符合选择标准的第一条消息(除非指定 MQGMO_BROWSE_NEXT,此时指序列中符合选择标准的下一条消息)。
返回时,MQGET 调用会将 MsgId 和 CorrelId 字段设置为所返回的消息的消息和相关标识(如有)。
| 要检索... | 匹配选项 |
|---|---|
| 队列中的第一条消息 | 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 |
注:
MQGET 调用通常检索来自队列的第一条消息。 如果在使用 MQGET 调用时指定特定消息,那么队列管理器必须搜索队列直至找到该消息。 这可影响应用程序的性能。
如果使用 V2 或更高版本的 MQGMO 结构,并且未指定 MQMO_MATCH_MSG_ID 或 MQMO_MATCH_CORREL_ID 标志,那么无需在 MQGET 间重置 MsgId 或 CorrelId 字段。
在 IBM® MQ for z/OS®上,可以使用队列属性 IndexType 来提高队列上 MQGET 操作的速度。 有关更多信息,请参阅 索引类型。
可通过在 MQGMO 结构中指定消息的 MsgToken 和 MatchOption MQMO_MATCH_MSG_TOKEN,从队列中获取特定的消息。 除非重新启动队列管理器,否则 MsgToken 将由最初将此消息放入队列的 MQPUT 调用或先前的 MQGET 操作返回并保持不变。
如果您仅对队列上的一部分消息感兴趣,可通过将选择字符串用于 MQOPEN 或 MQSUB 调用,来指定要处理的消息。 然后,MQGET 会检索满足选择字符串要求的下一条消息。 有关选择字符串的更多信息,请参阅 选择器。