MsgId (MQBYTE24)
這是用來區分不同訊息的位元組字串。 一般而言,雖然佇列管理程式不允許使用相同的訊息 ID ,但沒有兩個訊息應該具有相同的訊息 ID。 訊息 ID 是訊息的永久內容,在重新啟動佇列管理程式之後會持續保存。 因為訊息 ID 是位元組字串而非字串,所以當訊息從一個佇列管理程式流向另一個佇列管理程式時,訊息 ID 不會 在字集之間轉換。
對於 MQPUT 和 MQPUT1 呼叫,如果應用程式指定 MQMI_NONE 或 MQPMO_NEW_MSG_ID ,則佇列管理程式會在放置訊息時產生唯一訊息 ID 1 ,並將它放置在隨訊息一起傳送的訊息描述子中。 佇列管理程式也會在屬於傳送端應用程式的訊息描述子中傳回此訊息 ID。 應用程式可以使用此值來記錄特定訊息的相關資訊,以及回應應用程式其他部分的查詢。
如果要將訊息放入主題,佇列管理程式會根據需要為每一個發佈的訊息產生唯一訊息 ID。 如果由應用程式指定 MQPMO_NEW_MSG_ID ,則佇列管理程式會產生要在輸出時傳回的唯一訊息 ID。 如果應用程式指定 MQMI_NONE ,則在從呼叫傳回時, MQMD 中的 MsgId 欄位值不會變更。
如需保留發佈的詳細資料,請參閱 MQPMO 選項 (MQLONG) 中 MQPMO_RETAIN 的說明。
如果將訊息放置到配送清單中,則佇列管理程式會根據需要產生唯一訊息 ID ,但 MQMD 中的 MsgId 欄位值在從呼叫返回時保持不變,即使已指定 MQMI_NONE 或 MQPMO_NEW_MSG_ID。 如果應用程式需要知道佇列管理程式所產生的訊息 ID ,則應用程式必須提供包含 MsgId 欄位的 MQPMR 記錄。
傳送端應用程式也可以指定MQMI_NONE以外的訊息 ID 值; 這會停止佇列管理程式產生唯一訊息 ID。 轉遞訊息的應用程式可以使用此方法來傳播原始訊息的訊息 ID。
- 如果要求,則產生唯一值,如上述
- 將值遞送至發出訊息取得要求的應用程式
- 將值複製到它針對此訊息所產生之任何報告訊息的
CorrelId欄位 (視Report選項而定)
當佇列管理程式或訊息通道代理程式產生報告訊息時,它會以原始訊息的 Report 欄位 (MQRO_NEW_MSG_ID 或 MQRO_PASS_MSG_ID) 指定的方式設定 MsgId 欄位。 產生報告訊息的應用程式也必須執行此動作。
MsgId 是可用來從佇列擷取特定訊息的五個欄位之一。 一般而言, MQGET 呼叫會傳回佇列上的下一個訊息,但只要以任何組合指定五個選取準則中的一或多個,即可取得特定訊息; 這些欄位如下:MsgIdCorrelIdGroupIdMsgSeqNumberOffset
MatchOptions 欄位中設定對應的 MQMO_ * 比對選項,以使用這些欄位作為選取準則。 只有在那些欄位中具有指定值的訊息才是可供擷取的候選項。 MatchOptions 欄位的預設值 (如果應用程式未變更的話) 是同時符合訊息 ID 和相關性 ID。在 z/OS®上,您可以使用的選取準則受限於用於佇列的索引類型。 如需進一步詳細資料,請參閱 IndexType 佇列屬性。
一般而言,傳回的訊息是佇列上滿足選取準則的 第一個 訊息。 但如果指定 MQGMO_BROWSE_NEXT ,則傳回的訊息是滿足選取準則的 下一個 訊息; 此訊息的掃描會從現行游標位置 後面 的訊息開始。
- CorrelId 在 64 位元分散式平台上的 MQGET 呼叫,其中 CorrelId 索引不需要執行真正循序掃描。
- IndexType 在 z/OS上的 MQGET 呼叫。
在這兩種情況下,都會改善擷取效能。
如需如何在各種情況下使用選取準則的相關資訊,請參閱 表 2 。
指定 MQMI_NONE 作為訊息 ID 具有與指定 MQMO_MATCH_MSG_ID 不 相同的效果,即 任何 訊息 ID 都符合。
如果在 MQGET 呼叫的 GetMsgOpts 參數中指定 MQGMO_MSG_UNDER_CURSOR 選項,則會忽略此欄位。
從 MQGET 呼叫傳回時, MsgId 欄位會設為所傳回訊息的訊息 ID (如果有的話)。
- MQMI_NONE
- 未指定訊息 ID。
欄位長度的值為二進位零。
對於 C 程式設計語言,也會定義常數 MQMI_NONE_ARRAY; 此值與 MQMI_NONE 相同,但它是字元陣列而非字串。
這是 MQGET、MQPUT 及 MQPUT1 呼叫的輸入/輸出欄位。 此欄位的長度由 MQ_MSG_ID_LENGTH 提供。 此欄位的起始值為 MQMI_NONE。
MsgId 由 4 個位元組的產品 ID (ASCII 或 EBCDIC 中的 AMQ 或 CSQ ,其中, ¬ 代表空白字元) 所組成,後面接著唯一字串的產品特定實作。 在 IBM® MQ 中,這包含佇列管理程式名稱的前 12 個字元,以及衍生自系統時鐘的值。 因此,所有可交互通訊的佇列管理程式都必須具有前 12 個字元不同的名稱,以確保訊息 ID 是唯一的。 產生唯一字串的能力也取決於未向後變更的系統時鐘。 若要消除佇列管理程式所產生的訊息 ID 複製應用程式所產生的訊息 ID 的可能性,應用程式必須避免產生其起始字元在 ASCII 或 EBCDIC (X'41 '至 X'49' 及 X'C1'至 X'C9') 中介於 A 到 I 範圍內的 ID。 不過,不會阻止應用程式產生起始字元在這些範圍內的 ID。