取得特定訊息
有許多方法可從佇列取得特定訊息。 這些包括: 在 MsgId 和 CorrelId上選取,在 GroupId上選取 MsgSeq數字和偏移,並在 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 欄位設為所傳回訊息的訊息及相關性 ID (如果有的話)。
如果您將 MQMD 結構的 Version 欄位設為 2 ,則可以使用 GroupId、 MsgSeqNumber及 Offset 欄位。 表 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 |
MQGET 呼叫通常會從佇列擷取第一個訊息。 如果您在使用 MQGET 呼叫時指定特定訊息,佇列管理程式必須搜尋佇列,直到找到該訊息為止。 這可能會影響應用程式的效能。
如果您使用 MQGMO 結構第 2 版或更新版本,且未指定 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 會擷取滿足該選取字串的下一則訊息。 如需選取字串的相關資訊,請參閱 選取器。