取得特定訊息

有許多方法可從佇列取得特定訊息。 這些包括: 在 MsgId 和 CorrelId上選取,在 GroupId上選取 MsgSeq數字和偏移,並在 MsgToken上選取。 您也可以在開啟佇列時使用選擇字串。

若要從佇列取得特定訊息,請使用 MQMD 結構的 MsgIdCorrelId 欄位。 不過,應用程式可以明確設定這些欄位,因此您指定的值可能無法識別唯一訊息。 表 1 顯示針對這些欄位的可能設定所擷取的訊息。 如果在 MQGET 呼叫的 GetMsgOpts 參數中指定 MQGMO_MSG_UNDER_CURSOR ,則輸入時會忽略這些欄位。

表 1. 使用訊息及相關性 ID
擷取 ... MsgId CorrelId
佇列中的第一個訊息 MQMI_NONE MQCI_NONE
符合 MsgId 的第一個訊息 非零 MQCI_NONE
符合 CorrelId 的第一個訊息 MQMI_NONE 非零
同時符合 MsgIdCorrelId 的第一個訊息 非零 非零

在每一種情況下, 第一個 表示第一個滿足選取準則的訊息 (除非指定 MQGMO_BROWSE_NEXT ,當它表示序列中滿足選取準則的 下一個 訊息時)。

傳回時, MQGET 呼叫會將 MsgIdCorrelId 欄位設為所傳回訊息的訊息及相關性 ID (如果有的話)。

如果您將 MQMD 結構的 Version 欄位設為 2 ,則可以使用 GroupIdMsgSeqNumberOffset 欄位。 表 2 顯示針對這些欄位的可能設定所擷取的訊息。

表 2. 使用群組 ID
擷取 ... 符合選項
佇列中的第一個訊息 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 呼叫時指定特定訊息,佇列管理程式必須搜尋佇列,直到找到該訊息為止。 這可能會影響應用程式的效能。

如果您使用 MQGMO 結構第 2 版或更新版本,且未指定 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 會擷取滿足該選取字串的下一則訊息。 如需選取字串的相關資訊,請參閱 選取器