MQGMO 的選項 (MQLONG)
- 新增值 (不要多次新增相同的常數) ,或
- 使用位元 OR 運算來結合值 (如果程式設計語言支援位元運算)。
等待選項
- MQGMO_WAIT
- 應用程式會等待適當的訊息到達。 應用程式等待的時間上限指定在
WaitInterval中。重要事項: 如果立即提供適當的訊息,則沒有等待或延遲。如果禁止 MQGET 要求,或在等待時禁止 MQGET 要求,則會取消等待。 不論佇列上是否有適當的訊息,呼叫都會完成,並傳回
MQCC_FAILED及原因碼MQRC_GET_INHIBITED。您可以將
MQGMO_WAIT與或MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT選項搭配使用。如果數個應用程式在相同的共用佇列上等待,則下列規則會選取當適當的訊息到達時要啟動的應用程式:
如果多個沒有 BROWSE 選項的 MQGET 呼叫正在相同佇列上等待,則只會啟動一個。 佇列管理程式會依下列順序嘗試提供等待呼叫的優先順序:表 1. 在共用佇列上啟動 MQGET 呼叫的規則。 等待啟動的 MQGET 呼叫數 結果 使用 BROWSE 選項 沒有 BROWSE 選項 1 無 1 或更多 啟動一個沒有 BROWSE 選項的 MQGET 呼叫。 1 或更多 無 會啟動具有 BROWSE 選項的所有 MQGET 呼叫。 1 或更多 1 或更多 啟動一個沒有 BROWSE 選項的 MQGET 呼叫。 無法預期使用 BROWSE 選項啟動的 MQGET 呼叫數。 - 只有特定訊息 (例如,具有特定
MsgId或CorrelId(或兩者) 的訊息) 才能滿足的特定取得等待要求。 - 可由任何訊息滿足的一般 get-wait 要求。
附註:- 在第一個種類中,不會對更具體的 get-wait 要求提供額外的優先順序。 例如,同時指定
MsgId和CorrelId的要求。 - 在任一種類內,無法預測選取哪個應用程式。 特別是,等待時間最長的應用程式不一定是選取的應用程式。
- 路徑長度及作業系統的優先順序排程考量,可能表示作業系統優先順序低於預期的等待中應用程式會擷取訊息。
- 也可能發生未等待的應用程式優先於的應用程式擷取訊息。
在 z/OS®上,適用下列要點:- 如果您想要應用程式在等待訊息送達時繼續進行其他工作,請考慮改用信號選項 (
MQGMO_SET_SIGNAL)。 不過,信號選項是環境特有的; 您在不同環境之間連接的應用程式不得使用它。 - 如果有多個 MQGET 呼叫正在等待相同訊息,並混合等待及信號選項,則會平均考慮每一個等待中的呼叫。 將
MQGMO_SET_SIGNAL與MQGMO_WAIT一起指定是錯誤的。 將此選項與信號未處理的佇列控點一起指定也是錯誤。 - 如果您針對
IndexType為MQIT_MSG_TOKEN的佇列指定MQGMO_WAIT或MQGMO_SET_SIGNAL,則不允許任何選取準則。 這表示:- 如果您使用 version-1
MQGMO,請在 MQGET 呼叫MQMI_NONE及MQCI_NONE上指定的 MQMD 中設定MsgId及CorrelId欄位。 - 如果您使用 version-2 或更新版本
MQGMO,請將MatchOptions欄位設為MQMO_NONE。
- 如果您使用 version-1
- 對於共用佇列上的 MQGET 呼叫,且該呼叫是瀏覽要求或群組訊息的破壞性取得,且
MsgId和CorrelId都不符合,則會在 200 毫秒之後公佈您的信號 ECB。當以 MQEC_WAIT_INTERVAL_EXPIRED 公佈佇列時,即使適當的訊息可能尚未到達佇列,也會發生此情況,直到等待間隔過期為止。 公佈 MQEC_MSG_RESIDE 時,您必須重新發出第二個 MQGET 呼叫來擷取訊息 (如果有的話)。
此技術是用來確保及時通知您訊息到達,但在與非共用佇列上的類似呼叫序列相比較時,可能會顯示為非預期的處理額外負擔。
如果指定
MQGMO_BROWSE_MSG_UNDER_CURSOR或MQGMO_MSG_UNDER_CURSOR,則會忽略MQGMO_WAIT; 不會引發任何錯誤。 - 只有特定訊息 (例如,具有特定
- MQGMO_NO_WAIT
- 如果沒有可用的適當訊息,應用程式不會等待。
MQGMO_NO_WAIT與MQGMO_WAIT相反。MQGMO_NO_WAIT定義為輔助程式文件。 如果都未指定,則它是預設值。 - MQGMO_SET_SIGNAL
- 將此選項與
Signal1和Signal2欄位搭配使用。 它可讓應用程式在等待訊息到達時繼續進行其他工作。 它也容許 (如果有適當的作業系統機能可用) 應用程式等待訊息到達多個佇列。附註:MQGMO_SET_SIGNAL選項是環境特有的; 請勿將它用於您要連接的應用程式。在兩種情況下,呼叫完成的方式與未指定此選項相同:- 如果目前可用的訊息滿足訊息描述子中指定的準則。
- 如果偵測到參數錯誤或其他同步錯誤。
如果目前沒有符合訊息描述子中所指定準則的訊息可用,則控制會回到應用程式,而不等待訊息送達。 CompCode 和 Reason 參數設為
MQCC_WARNING和MQRC_SIGNAL_REQUEST_ACCEPTED。 未設定訊息描述子中的其他輸出欄位以及 MQGET 呼叫的輸出參數。 當適當的訊息稍後到達時,會透過張貼歐洲央行來傳遞信號。然後,呼叫者必須重新發出 MQGET 呼叫來擷取訊息。 應用程式可以使用作業系統提供的功能來等待此信號。
如果作業系統提供多重等待機制,您可以使用它來等待訊息到達數個佇列中的任何一個佇列。
如果指定非零
WaitInterval,則會在等待間隔到期之後遞送信號。 佇列管理程式也可以取消等待,在此情況下會遞送信號。多個 MQGET 呼叫可以為相同的訊息設定信號。 應用程式的啟動順序與
MQGMO_WAIT的說明相同。如果多個 MQGET 呼叫正在等待相同的訊息,則會平均考慮每一個等待中的呼叫。 呼叫可以包含等待和信號選項的混合。
在特定條件下, MQGET 呼叫可以擷取訊息,並且可以遞送相同訊息到達所產生的信號。 當信號遞送時,應用程式必須準備好沒有可用的訊息。
佇列控點最多只能有一個信號要求未完成。
此選項不適用於下列任何選項:MQGMO_UNLOCKMQGMO_WAIT
對於共用佇列上的 MQGET 呼叫,且該呼叫是瀏覽要求或群組訊息的破壞性取得,且
MsgId或CorrelId都不符合,使用者的信號 ECB 會在 200 毫秒之後MQEC_MSG_ARRIVED公佈。即使適當的訊息可能尚未到達佇列,在等待間隔到期之前,當佇列隨
MQEC_WAIT_INTERVAL_EXPIRED一起公佈時,仍會發生此情況。 當MQEC_MSG_ARRIVED公佈時,您必須重新發出第二個 MQGET 呼叫來擷取訊息 (如果有的話)。此技術是用來確保及時通知您訊息到達,但在與非共用佇列上的類似呼叫序列相比較時,可能會顯示為非預期的處理額外負擔。
當不常新增訊息時,這不是有效的訊息擷取方法。 為了避免瀏覽案例的額外負擔,請在 MQGET 呼叫上指定符合的
MsgId(如果未檢索或依MsgId檢索) 或 CorrelId (如果依CorrelId檢索)。
僅在 z/OS 上支援此選項。 - MQGMO_FAIL_IF_QUIESCING
- 如果佇列管理程式處於靜止狀態,則強制 MQGET 呼叫失敗。
在 z/OS上,如果連線 (適用於 CICS® 或 IMS 應用程式) 處於靜止狀態,則此選項也會強制 MQGET 呼叫失敗。如果此選項與MQGMO_WAIT或MQGMO_SET_SIGNAL一起指定,且在佇列管理程式進入靜止狀態時等待或信號未完成:- 取消等待,且呼叫會傳回完成碼
MQCC_FAILED,原因碼為MQRC_Q_MGR_QUIESCING或MQRC_CONNECTION_QUIESCING。 - 使用環境特定的信號完成碼來取消信號。
在 z/OS上,信號會完成,事件完成碼為 MQEC_Q_MGR_QUIESCING或MQEC_CONNECTION_QUIESCING。
MQGMO_FAIL_IF_QUIESCING,且佇列管理程式或連線進入靜止狀態,則不會取消等待或信號。 - 取消等待,且呼叫會傳回完成碼
同步點選項
- MQ GMO_同步點
- 要求是在正常工作單元通訊協定內運作。 訊息會標示為其他應用程式無法使用,但只有在確定工作單元時,才會從佇列中刪除它。 如果工作單元已取消,則訊息會重新變成可用。您可以維持未設定
MQGMO_SYNCPOINT和MQGMO_NO_SYNCPOINT。 在此情況下,工作單元通訊協定中取得要求的併入由執行佇列管理程式的環境決定。 它不是由執行應用程式的環境所決定。
在 z/OS上,取得要求是在工作單元內。- 在 z/OS以外的所有環境中,取得要求不在工作單元內。
由於這些差異,您想要埠的應用程式不得容許此選項預設; 請明確指定
MQGMO_SYNCPOINT或MQGMO_NO_SYNCPOINT。此選項不適用於下列任何選項:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_LOCKMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
- MQGMO_SYNCPOINT_IF_PERSISTENT
- 要求是在正常工作單元通訊協定內運作,但只有在擷取的訊息持續存在時才會執行。 持續訊息在 MQMD的
Persistence欄位中具有值MQPER_PERSISTENT。- 如果訊息持續存在,佇列管理程式會如同應用程式已指定
MQGMO_SYNCPOINT一樣處理呼叫。 - 如果訊息不是持續的,佇列管理程式會如同應用程式已指定
MQGMO_NO_SYNCPOINT一樣處理呼叫。
此選項不適用於下列任何選項:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_COMPLETE_MSGMQGMO_MARK_SKIP_BACKOUTMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINTMQGMO_UNLOCK
此選項在下列環境中受支援:
AIX®
IBM® i
Linux®
z/OS
- 如果訊息持續存在,佇列管理程式會如同應用程式已指定
- MQGMO_NO_SYNCPOINT
- 要求是在正常工作單元通訊協定之外運作。 如果您收到沒有瀏覽選項的訊息,則會立即從佇列中刪除該訊息。 藉由取消工作單元,無法再次使訊息可供使用。
如果您指定
MQGMO_BROWSE_FIRST或MQGMO_BROWSE_NEXT,則會假設此選項。您可以維持未設定MQGMO_SYNCPOINT和MQGMO_NO_SYNCPOINT。 在此情況下,工作單元通訊協定中取得要求的併入由執行佇列管理程式的環境決定。 它不是由執行應用程式的環境所決定。
在 z/OS上,取得要求是在工作單元內。- 在 z/OS以外的所有環境中,取得要求不在工作單元內。
由於這些差異,您要連接的應用程式不得容許此選項預設; 請明確指定
MQGMO_SYNCPOINT或MQGMO_NO_SYNCPOINT。此選項不適用於下列任何選項:MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENT
MQGMO_MARK_SKIP_BACKOUT- 在佇列上還原以這個選項標示的訊息,但不回復工作單元。
瀏覽選項
- MQGMO_BROWSE_FIRST
- 使用 MQOO_BROWSE 選項開啟佇列時,會建立瀏覽游標,並以邏輯方式放置在佇列上第一個訊息之前。 然後,您可以使用指定
MQGMO_BROWSE_FIRST、MQGMO_BROWSE_NEXT或MQGMO_BROWSE_MSG_UNDER_CURSOR選項的 MQGET 呼叫,以非破壞性方式從佇列中擷取訊息。 瀏覽游標會標示佇列上的訊息內的位置,下一個 MQGET 呼叫MQGMO_BROWSE_NEXT會從該位置搜尋適當的訊息。MQGMO_BROWSE_FIRST不適用於下列任何選項:MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_MARK_SKIP_BACKOUTMQGMO_MSG_UNDER_CURSORMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
具有
MQGMO_BROWSE_FIRST的 MQGET 呼叫會忽略瀏覽游標的前一個位置。 會擷取佇列上滿足訊息描述子中所指定條件的第一個訊息。 訊息會保留在佇列上,而瀏覽游標會定位在此訊息上。在此呼叫之後,瀏覽游標會定位在已傳回的訊息上。 在發出具有
MQGMO_BROWSE_NEXT的下一個 MQGET 呼叫之前,可能會從佇列中移除該訊息。 在此情況下,瀏覽游標會保留在佇列中訊息所佔用的位置,即使該位置現在是空的。搭配使用
MQGMO_MSG_UNDER_CURSOR選項與非瀏覽 MQGET 呼叫,以從佇列中移除訊息。即使使用相同的
Hobj控點,非瀏覽 MQGET 呼叫也不會移動瀏覽游標。 也不會由傳回完成碼MQCC_FAILED或原因碼MQRC_TRUNCATED_MSG_FAILED的瀏覽 MQGET 呼叫移動。指定
MQGMO_LOCK選項與此選項,以鎖定已瀏覽的訊息。您可以將
MQGMO_BROWSE_FIRST指定為MQGMO_*及MQMO_*選項的任何有效組合,以控制邏輯訊息群組及區段中訊息的處理。如果您指定
MQGMO_LOGICAL_ORDER,則會以邏輯順序瀏覽訊息。 如果您省略該選項,則會以實體順序瀏覽訊息。 如果您指定MQGMO_BROWSE_FIRST,則可以在邏輯順序與實體順序之間切換。 使用MQGMO_BROWSE_NEXT的後續 MQGET 呼叫瀏覽佇列的順序,與為佇列控點指定MQGMO_BROWSE_FIRST的最新呼叫相同。佇列管理程式會為 MQGET 呼叫保留兩組群組及區段資訊。 瀏覽呼叫的群組和區段資訊與從佇列中移除訊息之呼叫的資訊分開保留。 如果您指定
MQGMO_BROWSE_FIRST,佇列管理程式會忽略用於瀏覽的群組和區段資訊。 它會掃描佇列,就像沒有現行群組和現行邏輯訊息一樣。 如果 MQGET 呼叫成功,完成碼MQCC_OK或MQCC_WARNING,則用於瀏覽的群組和區段資訊會設為所傳回訊息的群組和區段資訊。 如果呼叫失敗,則群組及區段資訊會保持與呼叫之前的相同。 - MQGMO_BROWSE_NEXT
- 將瀏覽游標前進至佇列上滿足 MQGET 呼叫上指定的選取準則的下一個訊息。 訊息會傳回至應用程式,但仍留在佇列上。
- MQGMO_BROWSE_MSG_UNDER_CURSOR
- 擷取由瀏覽游標以非破壞性方式指向的訊息,不論 MQGMO中
MatchOptions欄位中指定的MQMO_*選項為何。 - MQGMO_MSG_UNDER_CURSOR
- 擷取瀏覽游標所指向的訊息,不論 MQGMO中
MatchOptions欄位中指定的MQMO_*選項為何。 從佇列中移除訊息。瀏覽游標所指向的訊息是前次使用
MQGMO_BROWSE_FIRST或MQGMO_BROWSE_NEXT選項擷取的訊息。如果使用
MQGMO_MSG_UNDER_CURSOR指定MQGMO_COMPLETE_MSG,則瀏覽游標必須識別其 MQMD 中的Offset欄位為零的訊息。 如果未滿足此條件,則呼叫會失敗,原因碼為MQRC_INVALID_MSG_UNDER_CURSOR。此選項不適用於下列任何選項:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_UNLOCK
- MQ GMO_MARK_BROWSE_HANDLE
- 即會標示成功 MQGET所傳回的訊息,或所傳回
MsgToken所識別的訊息。 標記特定於呼叫中使用的物件控點。訊息未從佇列中移除。
只有在同時指定下列其中一個選項時,MQGMO_MARK_BROWSE_HANDLE才有效:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
MQGMO_MARK_BROWSE_HANDLE不適用於下列任何選項:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
訊息會保持此狀態,直到發生下列其中一個事件為止:- 所涉及的物件控點已正常關閉或以其他方式關閉。
- 透過呼叫 MQGET 並使用選項
MQGMO_UNMARK_BROWSE_HANDLE,將此控點的訊息取消標示。 - 此訊息從破壞性 MQGET的呼叫中傳回,該呼叫會完成
MQCC_OK或MQCC_WARNING。 即使稍後回復 MQGET ,訊息狀態仍會維持變更。 - 訊息到期。
- MQGMO_MARK_BROWSE_CO_OP
- 由成功 MQGET傳回的訊息,或由傳回的
MsgToken識別的訊息,會針對協同作業集中的所有控點標示。合作層次標記是除了任何可能已設定的控點層次標記之外的其他標記。
訊息未從佇列中移除。
只有在對指定MQOO_CO_OP之 MQOPEN 的呼叫傳回所使用的物件控點時,MQGMO_MARK_BROWSE_CO_OP才有效。 您也必須指定下列其中一個 MQGMO 選項:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
此選項不適用於下列任何選項:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
如果已標示訊息,且未指定
MQGMO_UNMARKED_BROWSE_MSG選項,則呼叫會失敗,並傳回MQCC_FAILED及原因碼MQRC_MSG_MARKED_BROWSE_CO_OP。訊息會保持此狀態,直到發生下列其中一個事件為止:- 會關閉協同作業集中的所有物件控點。
- 透過使用選項
MQGMO_UNMARK_BROWSE_CO_OP對 MQGET 進行呼叫,將訊息取消標示為協同作業的瀏覽器。 - 佇列管理程式會自動取消標示訊息。
- 呼叫非瀏覽 MQGET會傳回此訊息。 即使稍後回復 MQGET ,訊息狀態仍會維持變更。
- 訊息到期。
MQGMO_UNMARKED_BROWSE_MSG- 指定
MQGMO_UNMARKED_BROWSE_MSG的 MQGET 呼叫會傳回視為未標示其控點的訊息。 如果訊息已標示為其控點,則不會傳回訊息。 如果佇列是由使用選項MQOO_CO_OP對 MQOPEN的呼叫所開啟,且訊息已由協同作業集的成員標示,則它也不會傳回訊息。此選項不適用於下列任何選項:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
- MQGMO_UNMARK_BROWSE_CO_OP
- 在呼叫指定此選項的 MQGET 之後,該組協同作業控點中的任何開啟控點都不再考量該訊息,以標示該協同作業控點。 如果在此呼叫之前已在控點層次標示訊息,則仍會將該訊息視為在控點層次標示。
使用
MQGMO_UNMARK_BROWSE_CO_OP只有在使用選項MQOO_CO_OP成功呼叫 MQOPEN 所傳回的控點時才有效。 即使未將訊息視為由一組協同作業的控點所標示, MQGET 仍會成功。MQGMO_UNMARK_BROWSE_CO_OP在非瀏覽 MQGET 呼叫中無效,或具有下列任何選項:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
- MQGMO_UNMARK_BROWSE_HANDLE
- 在呼叫指定此選項的 MQGET 之後,不再將找到的訊息視為已被此控點標示。
即使未標示此控點的訊息,呼叫仍會成功。
此選項在非瀏覽 MQGET 呼叫上無效,或具有下列任何選項:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
鎖定選項
- MQGMO_LOCK
- 鎖定已瀏覽的訊息,使佇列開啟的任何其他控點都看不見該訊息。 只有在同時指定下列其中一個選項時,才能指定選項:
MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXTMQGMO_BROWSE_MSG_UNDER_CURSOR
每一個佇列控點只能鎖定一個訊息。 訊息可以是邏輯訊息或實體訊息:- 如果您指定
MQGMO_COMPLETE_MSG,則構成邏輯訊息的所有訊息區段都會鎖定至佇列控點。 訊息必須全部出現在佇列上且可供擷取。 - 如果您省略
MQGMO_COMPLETE_MSG,則只會將單一實體訊息鎖定至佇列控點。 如果此訊息碰巧是邏輯訊息的區段,則已鎖定區段會阻止其他應用程式使用MQGMO_COMPLETE_MSG來擷取或瀏覽邏輯訊息。
鎖定訊息一律是瀏覽游標下的訊息。 稍後指定
MQGMO_MSG_UNDER_CURSOR選項的 MQGET 呼叫可以從佇列中移除訊息。 其他使用佇列控點的 MQGET 呼叫也可以移除訊息 (例如,指定已鎖定訊息之訊息 ID 的呼叫)。如果呼叫傳回完成碼
MQCC_FAILED或MQCC_WARNING,原因碼為MQRC_TRUNCATED_MSG_FAILED,則不會鎖定任何訊息。如果應用程式未從佇列中移除訊息,則下列其中一個動作會釋放鎖定:- 對這個控點發出另一個 MQGET 呼叫,並指定
MQGMO_BROWSE_FIRST或MQGMO_BROWSE_NEXT。 如果呼叫以MQCC_OK或MQCC_WARNING完成,則會釋放鎖定。 如果呼叫完成並出現MQCC_FAILED,則訊息會保持鎖定。 不過,下列異常狀況適用:- 如果
MQCC_WARNING隨MQRC_TRUNCATED_MSG_FAILED一起傳回,則不會解除鎖定訊息。 - 如果隨
MQRC_NO_MSG_AVAILABLE一起傳回MQCC_FAILED,則會解除鎖定訊息。
如果您也指定
MQGMO_LOCK,則會鎖定傳回的訊息。 如果您省略MQGMO_LOCK,則在呼叫之後不會有鎖定訊息。如果您指定
MQGMO_WAIT,且沒有立即可用的訊息,則在開始等待之前會解除鎖定原始訊息。 - 如果
- 使用
MQGMO_BROWSE_MSG_UNDER_CURSOR針對此控點發出另一個 MQGET 呼叫,但不使用MQGMO_LOCK。 如果呼叫以MQCC_OK或MQCC_WARNING完成,則會釋放鎖定。 如果呼叫完成並出現MQCC_FAILED,則訊息會保持鎖定。 不過,下列異常狀況適用:- 如果
MQCC_WARNING隨MQRC_TRUNCATED_MSG_FAILED一起傳回,則不會解除鎖定訊息。
- 如果
- 使用
MQGMO_UNLOCK針對此控點發出另一個 MQGET 呼叫。 - 使用控點發出 MQCLOSE 呼叫。 MQCLOSE 可能是隱含的,由應用程式結束所造成。
MQOO_BROWSE之外,不需要任何特殊 MQOPEN 選項來指定MQGMO_LOCK。MQGMO_LOCK不適用於下列任何選項:MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
- MQGMO_UNLOCK
- 要解除鎖定的訊息先前必須已由 MQGET 呼叫使用
MQGMO_LOCK選項鎖定。 如果此控點未鎖定任何訊息,則呼叫會以MQCC_WARNING和MQRC_NO_MSG_LOCKED完成。如果您指定
MQGMO_UNLOCK,則不會檢查或變更 MsgDesc、 BufferLength、 Buffer及 DataLength 參數。Buffer中未傳回任何訊息。指定
MQGMO_UNLOCK不需要特殊開啟選項 (雖然首先需要MQOO_BROWSE才能發出鎖定要求)。除了下列選項之外,此選項不適用於任何選項:MQGMO_NO_WAITMQGMO_NO_SYNCPOINT
訊息-資料選項
- MQGMO_ACCEPT_TRUNCATED_MSG
- 如果訊息緩衝區太小而無法保留完整訊息,請容許 MQGET 呼叫填入緩衝區。 MQGET 會盡可能在緩衝區中填入訊息。 它會發出警告完成碼,並完成其處理。 這表示:
- 瀏覽訊息時,瀏覽游標會進階至傳回的訊息。
- 移除訊息時,會從佇列中移除傳回的訊息。
- 如果未發生其他錯誤,則會傳回原因碼 MQRC_TRUNCATED_MSG_ACCEPTED。
- 瀏覽訊息時,瀏覽游標不是進階的。
- 移除訊息時,不會從佇列中移除訊息。
- 如果未發生其他錯誤,則會傳回原因碼
MQRC_TRUNCATED_MSG_FAILED。
- MQ GMO_CONVERT
- 此選項會轉換訊息中的應用程式資料,以符合 MQGET 呼叫上 MsgDesc 參數中指定的
CodedCharSetId及Encoding值。 在將資料複製到 Buffer 參數之前,會先轉換資料。轉換處理程序會假設放置訊息時指定的Format欄位,以識別訊息中資料的本質。 訊息資料由佇列管理程式轉換成內建格式,並由使用者撰寫的結束程式轉換成其他格式。 如需資料轉換結束程式的詳細資料,請參閱 資料轉換結束程式 。- 如果轉換成功,則從 MQGET 呼叫返回時, MsgDesc 參數中指定的
CodedCharSetId和Encoding欄位保持不變。 - 如果僅轉換失敗,則會傳回未轉換的訊息資料。
MsgDesc中的CodedCharSetId及Encoding欄位會設為未轉換訊息的值。 在此情況下,完成碼為MQCC_WARNING。
請參閱 MQMD-訊息描述子 中說明的
Format欄位,以取得佇列管理程式為其執行轉換的格式名稱清單。 - 如果轉換成功,則從 MQGET 呼叫返回時, MsgDesc 參數中指定的
群組和區段選項
- 實體訊息
- 實體訊息是可以放置在佇列上或從佇列中移除的最小資訊單元。 它通常對應於在單一 MQPUT、 MQPUT1或 MQGET 呼叫上指定或擷取的資訊。 每個實體訊息都有自己的訊息描述子 MQMD。 通常,實體訊息是透過訊息 ID ( MQMD中的
MsgId欄位) 的不同值來識別。 佇列管理程式不會施行不同的值。 - 邏輯訊息
- 邏輯訊息是應用程式資訊的單一單元。 在沒有系統限制的情況下,邏輯訊息與實體訊息相同。 如果邏輯訊息很大,系統限制可能會建議或需要將邏輯訊息分割成兩個以上實體訊息 (稱為區段)。
已分段的邏輯訊息包含兩個以上具有相同非空值群組 ID ( MQMD中的
GroupId欄位) 的實體訊息。 它們在 MQMD中具有相同的訊息序號MsgSeqNumber欄位。 透過 MQMD中區段偏移Offset欄位的不同值來識別區段。 區段偏移是實體訊息中資料從邏輯訊息中資料開始的偏移。 因為每一個區段都是實體訊息,所以邏輯訊息中的區段通常具有不同的訊息 ID。尚未分段但傳送應用程式已允許分段的邏輯訊息也具有非空值群組 ID。 在此情況下,如果邏輯訊息不屬於訊息群組,則只有一個實體訊息具有該群組 ID。 除非邏輯訊息屬於訊息群組,否則傳送應用程式已禁止分段的邏輯訊息具有空值群組 ID
MQGI_NONE。 - 訊息群組
- 訊息群組是一組具有相同非空值群組 ID 的一或多個邏輯訊息。 群組中的邏輯訊息由訊息序號的不同值來識別。 序號是 1 到 n 範圍內的整數,其中 n 是群組中邏輯訊息的數目。 如果已分段一個以上邏輯訊息,則群組中有 n 則以上的實體訊息。
- MQ GMO_LOGICAL_ORDER
MQGMO_LOGICAL_ORDER控制佇列控點連續 MQGET 呼叫所傳回訊息的順序。 必須在每一個呼叫上指定選項。如果針對相同佇列控點的連續 MQGET 呼叫指定
MQGMO_LOGICAL_ORDER,則會依訊息序號的順序傳回群組中的訊息。 邏輯訊息的區段會依其區段偏移所給定的順序傳回。 此順序可能與那些訊息及區段在佇列上出現的順序不同。附註: 指定MQGMO_LOGICAL_ORDER對不屬於群組且不是區段的訊息沒有負面結果。 實際上,會將這類訊息視為每一個都屬於只由一個訊息組成的訊息群組。 從包含群組中混合訊息、訊息區段及未分段訊息 (不在群組中) 的佇列中擷取訊息時,可以放心地指定MQGMO_LOGICAL_ORDER。若要以所需順序傳回訊息,佇列管理程式會在連續 MQGET 呼叫之間保留群組及區段資訊。 群組及區段資訊可識別佇列控點的現行訊息群組及現行邏輯訊息。 它也會識別群組及邏輯訊息中的現行位置,以及是否在工作單元內擷取訊息。 因為佇列管理程式會保留此資訊,所以在每次 MQGET 呼叫之前,應用程式都不需要設定群組和區段資訊。 具體而言,它表示應用程式不需要在 MQMD中設定
GroupId、MsgSeqNumber及Offset欄位。 不過,應用程式必須在每次呼叫時正確設定MQGMO_SYNCPOINT或MQGMO_NO_SYNCPOINT選項。開啟佇列時,沒有現行訊息群組及現行邏輯訊息。 當 MQGET 呼叫傳回具有MQMF_MSG_IN_GROUP旗標的訊息時,訊息群組會變成現行訊息群組。 在連續呼叫上指定MQGMO_LOGICAL_ORDER之後,該群組會保留現行群組,直到傳回具有下列項目的訊息為止:MQMF_LAST_MSG_IN_GROUPwithoutMQMF_SEGMENT(亦即,群組中的最後一則邏輯訊息未分段) ,或MQMF_LAST_MSG_IN_GROUPwithMQMF_LAST_SEGMENT(亦即,傳回的訊息是群組中最後一個邏輯訊息的最後一個區段)。
MQMF_SEGMENT旗標的訊息時,邏輯訊息會變成現行邏輯訊息。 當傳回具有MQMF_LAST_SEGMENT旗標的訊息時,邏輯訊息會終止。如果未指定選取準則,則連續的 MQGET 呼叫會以正確的順序傳回佇列上第一個訊息群組的訊息。 然後,它們會傳回第二個訊息群組的訊息,依此類推,直到沒有其他可用的訊息為止。 在MatchOptions欄位中指定下列一或多個選項,即可選取傳回的特定訊息群組:MQMO_MATCH_MSG_IDMQMO_MATCH_CORREL_IDMQMO_MATCH_GROUP_ID
MatchOptions欄位。表 2 顯示當嘗試尋找要在 MQGET 呼叫中傳回的訊息時,佇列管理程式所尋找的MsgId、CorrelId、GroupId、MsgSeqNumber及Offset欄位值。 這些規則適用於從佇列中移除訊息,以及瀏覽佇列上的訊息。 在表格中,表示「是」或「否」:LOG ORD- 指出是否在通話中指定
MQGMO_LOGICAL_ORDER選項。 Cur grp- 指出在呼叫之前是否存在現行訊息群組。
Cur log msg- 指出在呼叫之前是否存在現行邏輯訊息。
- 其他直欄
- 顯示佇列管理程式所尋找的值。 「前一個」表示針對佇列控點前一個訊息中的欄位所傳回的值。
表 2. 與邏輯訊息群組及區段中的訊息相關的 MQGET 選項 您指定的選項 呼叫之前的群組和日誌訊息狀態 佇列管理程式尋找的值 LOG ORDCur grpCur log msgMsgIdCorrelIdGroupIdMsgSeqNumberOffset是 否 否 控制者 MatchOptions控制者 MatchOptions控制者 MatchOptions1 0 是 否 是 任何訊息 ID 任何相關性 ID 前一個群組 ID 1 前一個偏移 + 前一個區段長度 是 是 否 任何訊息 ID 任何相關性 ID 前一個群組 ID 前一個序號 + 1 0 是 是 是 任何訊息 ID 任何相關性 ID 前一個群組 ID 前一個序號 前一個偏移 + 前一個區段長度 否 兩者擇一 兩者擇一 控制者 MatchOptions控制者 MatchOptions控制者 MatchOptions控制者 MatchOptions控制者 MatchOptions如果佇列上存在多個訊息群組,且符合傳回資格,則會以每一個群組中第一個邏輯訊息之第一個區段的佇列位置所決定的順序來傳回群組。 亦即,訊息序號為 1 且偏移為 0 的實體訊息會決定傳回合格群組的順序。
MQGMO_LOGICAL_ORDER選項會影響工作單元,如下所示:- 如果在工作單元內擷取群組中的第一個邏輯訊息或區段,則如果使用相同的佇列控點,則必須在工作單元內擷取群組中的所有其他邏輯訊息和區段。 不過,它們不需要在相同的工作單元內擷取。 這可讓由許多實體訊息組成的訊息群組,在佇列控點的兩個以上連續工作單元之間分割。
- 如果未在工作單元內擷取群組中的第一個邏輯訊息或區段,且使用相同的佇列控點,則無法在工作單元內擷取群組中的任何其他邏輯訊息和區段。
MQRC_INCONSISTENT_UOW。指定
MQGMO_LOGICAL_ORDER時, MQGET 呼叫上提供的 MQGMO 不得小於MQGMO_VERSION_2,且 MQMD 不得小於MQMD_VERSION_2。 如果未滿足此條件,則呼叫會在適當的情況下失敗,原因碼為MQRC_WRONG_GMO_VERSION或MQRC_WRONG_MD_VERSION。如果未針對佇列控點的連續 MQGET 呼叫指定
MQGMO_LOGICAL_ORDER,則會傳回訊息,而不考慮它們是否屬於訊息群組,或它們是否為邏輯訊息的區段。 這表示來自特定群組或邏輯訊息的訊息或區段可能不正常傳回,或與來自其他群組或邏輯訊息的訊息或區段混合,或與不在群組中且不是區段的訊息混合。 在此狀況下,連續 MQGET 呼叫所傳回的特定訊息由那些呼叫上指定的MQMO_*選項控制 (如需這些選項的詳細資料,請參閱 MQGMO-Get-message 選項 中說明的MatchOptions欄位)。這是在系統失效之後,可用來在中間重新啟動訊息群組或邏輯訊息的技術。 當系統重新啟動時,應用程式可以將
GroupId、MsgSeqNumber、Offset及MatchOptions欄位設為適當的值,然後發出 MQGET 呼叫並設定MQGMO_SYNCPOINT或MQGMO_NO_SYNCPOINT,但不指定MQGMO_LOGICAL_ORDER。 如果此呼叫成功,佇列管理程式會保留群組和區段資訊,後續使用該佇列控點的 MQGET 呼叫可以正常指定MQGMO_LOGICAL_ORDER。佇列管理程式針對 MQGET 呼叫所保留的群組和區段資訊,與它針對 MQPUT 呼叫所保留的群組和區段資訊不同。 此外,佇列管理程式還會保留下列項目的個別資訊:- 從佇列中移除訊息的 MQGET 呼叫。
- MQGET 呼叫可瀏覽佇列上的訊息。
對於任何給定的佇列控點,應用程式可以將指定MQGMO_LOGICAL_ORDER的 MQGET 呼叫與未指定的 MQGET 呼叫混合。 不過,請注意下列要點:- 如果您省略
MQGMO_LOGICAL_ORDER,則每一個成功的 MQGET 呼叫都會導致佇列管理程式將已儲存的群組及區段資訊設為與所傳回訊息相對應的值; 這會取代佇列管理程式為佇列控點所保留的現有群組及區段資訊。 只會修改適用於呼叫動作 (瀏覽或移除) 的資訊。 - 如果您省略
MQGMO_LOGICAL_ORDER,則當有現行訊息群組或邏輯訊息時,呼叫不會失敗; 呼叫可能會成功,並傳回MQCC_WARNING完成碼。 表 3 顯示可能產生的各種觀察值。 在這些情況下,如果完成碼不是MQCC_OK,則原因碼是下列其中一項 (適當的話):MQRC_INCOMPLETE_GROUPMQRC_INCOMPLETE_MSGMQRC_INCONSISTENT_UOW
附註: 在瀏覽佇列時,或在關閉已開啟以進行瀏覽但未輸入的佇列時,佇列管理程式不會檢查群組及區段資訊; 在這些情況下,完成碼一律為MQCC_OK(假設沒有其他錯誤)。
表 3. MQGET 或 MQCLOSE 呼叫與群組和區段資訊不一致時的結果 現行呼叫為 前一個呼叫是 MQGET ,使用 MQGMO_LOGICAL_ORDER前一個通話是 MQGET 沒有 MQGMO_LOGICAL_ORDERMQGET( MQGMO_LOGICAL_ORDER)MQCC_FAILEDMQCC_FAILEDMQGET 沒有 MQGMO_LOGICAL_ORDERMQCC_WARNINGMQCC_OKMQCLOSE 具有未終止的群組或邏輯訊息 MQCC_WARNINGMQCC_OK建議以邏輯順序擷取訊息及區段的應用程式指定
MQGMO_LOGICAL_ORDER,因為這是最簡單的選項。 此選項可讓應用程式解除管理群組和區段資訊的需求,因為佇列管理程式會管理該資訊。 不過,特殊化應用程式可能需要比MQGMO_LOGICAL_ORDER選項所提供的更多控制,不指定該選項即可達成此目的。 然後,應用程式必須確保 MQMD中的MsgId、CorrelId、GroupId、MsgSeqNumber及Offset欄位,以及 MQGMO中的MatchOptions中的MQMO_*選項,在每一個 MQGET 呼叫之前都正確設定。例如,想要轉遞所接收實體訊息的應用程式,不論這些訊息是在邏輯訊息的群組或區段中,都不能指定
MQGMO_LOGICAL_ORDER。 在傳送與接收佇列管理程式之間具有多條路徑的複雜網路中,實體訊息可能不正常送達。 透過在 MQPUT 呼叫上既未指定MQGMO_LOGICAL_ORDER,也未指定對應的MQPMO_LOGICAL_ORDER,轉遞應用程式可以在每一個實體訊息到達時立即擷取並轉遞它,而不需要等待邏輯順序中的下一個實體訊息到達。在適當的情況下,您可以將MQGMO_LOGICAL_ORDER與任何其他MQGMO_*選項一起指定,以及與各種MQMO_*選項一起指定 (請參閱前一節)。
在 z/OS上,專用及共用佇列支援此選項,但佇列必須具有索引類型 MQIT_GROUP_ID。 對於共用佇列,佇列所對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。- 下列平台的所有本端佇列都支援此選項:
AIX
Linux
IBM i
Windows
- MQ GMO_COMPLETE_MSG
- MQGET 呼叫只能傳回完整邏輯訊息。 如果邏輯訊息已分段,則佇列管理程式會重新組合區段,並將完整的邏輯訊息傳回至應用程式; 擷取邏輯訊息的應用程式不會明顯看到邏輯訊息已分段的事實。附註: 這是唯一讓佇列管理程式重新組合訊息區段的選項。 如果未指定,則如果區段存在於佇列上 (且滿足 MQGET 呼叫上指定的其他選取準則) ,則會將區段個別傳回給應用程式。 不想要接收個別區段的應用程式必須一律指定
MQGMO_COMPLETE_MSG。如果要使用這個選項,應用程式必須提供足夠大的緩衝區來容納完整訊息,或指定
MQGMO_ACCEPT_TRUNCATED_MSG選項。如果佇列包含部分區段遺漏的分段訊息 (可能是因為它們在網路中已延遲且尚未到達) ,則指定
MQGMO_COMPLETE_MSG會阻止擷取屬於不完整邏輯訊息的區段。 不過,這些訊息區段仍會構成 CurrentQDepth 佇列屬性的值; 這表示即使CurrentQDepth大於零,也可能沒有可擷取的邏輯訊息。對於持續訊息,佇列管理程式只能在工作單元內重新組合區段:- 如果 MQGET 呼叫在使用者定義的工作單元內運作,則會使用該工作單元。 如果在重組處理程序期間呼叫失敗,則佇列管理程式會在佇列上恢復在重組期間移除的任何區段。 不過,失敗並不會阻止順利確定工作單元。
- 如果呼叫是在使用者定義工作單元之外運作,且沒有使用者定義工作單元存在,則佇列管理程式會在呼叫期間建立工作單元。 如果呼叫成功,佇列管理程式會自動確定工作單元 (應用程式不需要這麼做)。 如果呼叫失敗,佇列管理程式會取消工作單元。
- 如果呼叫是在使用者定義工作單元之外運作,但存在使用者定義工作單元,則佇列管理程式無法重新組合。 如果訊息不需要重組,呼叫仍會成功。 但是如果訊息需要重組,則呼叫會失敗,原因碼為
MQRC_UOW_NOT_AVAILABLE。
對於非持續訊息,佇列管理程式不需要工作單元即可執行重新組合。
每一個屬於區段的實體訊息都有自己的訊息描述子。 對於構成單一邏輯訊息的區段,訊息描述子中的大部分欄位對於邏輯訊息中的所有區段都是相同的; 通常只有
MsgId、Offset和MsgFlags欄位在邏輯訊息中的區段之間會有所不同。 不過,如果區段放置在中間佇列管理程式的無法傳送郵件的佇列上,則 DLQ 處理程式會擷取指定MQGMO_CONVERT選項的訊息,這可能會導致變更區段的字集或編碼。 如果 DLQ 處理程式順利傳送區段,則區段可能具有字集或編碼,與區段到達目的地佇列管理程式時邏輯訊息中的其他區段不同。由
CodedCharSetId和Encoding欄位不同的區段所組成的邏輯訊息,無法由佇列管理程式重新組合成單一邏輯訊息。 相反地,佇列管理程式會重新組合並傳回邏輯訊息開頭的前幾個連續區段,這些區段具有相同的字集 ID 及編碼,且 MQGET 呼叫會適當地完成,並具有完成碼MQCC_WARNING及原因碼MQRC_INCONSISTENT_CCSIDS或MQRC_INCONSISTENT_ENCODINGS。 不論是否指定MQGMO_CONVERT,都會發生這種情況。 若要擷取其餘區段,應用程式必須在沒有MQGMO_COMPLETE_MSG選項的情況下重新發出 MQGET 呼叫,逐一擷取區段。MQGMO_LOGICAL_ORDER可用來依序擷取其餘區段。放置區段的應用程式也可以將訊息描述子中的其他欄位設為區段之間不同的值。 不過,如果接收端應用程式使用
MQGMO_COMPLETE_MSG來擷取邏輯訊息,則這樣做沒有任何好處。 當佇列管理程式重新組合邏輯訊息時,它會在訊息描述子中傳回第一個區段的訊息描述子中的值; 唯一例外是MsgFlags欄位,佇列管理程式會設定該欄位以指出重新組合的訊息是唯一區段。如果對報告訊息指定
MQGMO_COMPLETE_MSG,則佇列管理程式會執行特殊處理。 佇列管理程式會檢查佇列,以查看該報告類型與邏輯訊息中不同區段相關的所有報告訊息是否都存在於佇列上。 如果是,則可以透過指定MQGMO_COMPLETE_MSG,將它們擷取為單一訊息。 若要這樣做,必須由支援分段的佇列管理程式或 MCA 產生報告訊息,或原始應用程式必須要求至少 100 個位元組的訊息資料 (亦即,必須指定適當的MQRO_*_WITH_DATA或MQRO_*_WITH_FULL_DATA選項)。 如果區段存在的應用程式資料量小於完整數量,則會在傳回的報告訊息中以空值取代遺漏的位元組。如果使用
MQGMO_MSG_UNDER_CURSOR或MQGMO_BROWSE_MSG_UNDER_CURSOR指定MQGMO_COMPLETE_MSG,則瀏覽游標必須位於其 MQMD 中Offset欄位值為 0 的訊息上。 如果未滿足此條件,則呼叫會失敗,原因碼為MQRC_INVALID_MSG_UNDER_CURSOR。MQGMO_COMPLETE_MSG默示MQGMO_ALL_SEGMENTS_AVAILABLE,因此不需要指定。MQGMO_COMPLETE_MSG可以與MQGMO_SYNCPOINT_IF_PERSISTENT以外的任何其他MQGMO_*選項一起指定,也可以與 MQMO_MATCH_OFFSET 以外的任何MQMO_*選項一起指定。
在 z/OS上,專用及共用佇列支援此選項,但佇列必須具有 MQIT_GROUP_ID 的索引類型。 對於共用佇列,佇列對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。- 在下列平台上:
AIX
IBM i
Linux
Windows
- MQGMO_ALL_MSGS_AVAILABLE
- 只有在群組中的所有訊息都可用時,群組中的訊息才會變成可供擷取。 如果佇列包含遺漏部分訊息的訊息群組 (可能是因為它們在網路中已延遲且尚未到達) ,則指定
MQGMO_ALL_MSGS_AVAILABLE會阻止擷取屬於不完整群組的訊息。 不過,那些訊息仍會構成 CurrentQDepth 佇列屬性的值; 這表示即使CurrentQDepth大於零,也可能沒有可擷取的訊息群組。 如果沒有其他可擷取的訊息,則在指定的等待間隔 (如果有的話) 過期之後會傳回原因碼MQRC_NO_MSG_AVAILABLE。MQGMO_ALL_MSGS_AVAILABLE的處理取決於是否同時指定MQGMO_LOGICAL_ORDER:- 如果同時指定這兩個選項,則只有在沒有現行群組或邏輯訊息時,
MQGMO_ALL_MSGS_AVAILABLE才會生效。 如果有現行群組或邏輯訊息,則會忽略MQGMO_ALL_MSGS_AVAILABLE。 這表示在以邏輯順序處理訊息時,MQGMO_ALL_MSGS_AVAILABLE可以保持開啟狀態。 - 如果指定
MQGMO_ALL_MSGS_AVAILABLE時未指定MQGMO_LOGICAL_ORDER,則MQGMO_ALL_MSGS_AVAILABLE一律具有效果。 這表示在從佇列中移除群組中的第一個訊息之後,必須關閉此選項,才能移除群組中的其餘訊息。
順利完成指定
MQGMO_ALL_MSGS_AVAILABLE的 MQGET 呼叫,表示在發出 MQGET 呼叫時,群組中的所有訊息都在佇列上。 不過,請注意,其他應用程式仍可以從群組中移除訊息 (該群組未鎖定至擷取群組中第一個訊息的應用程式)。如果省略此選項,則即使群組不完整,也可以擷取屬於群組的訊息。
MQGMO_ALL_MSGS_AVAILABLE默示MQGMO_ALL_SEGMENTS_AVAILABLE,因此不需要指定。MQGMO_ALL_MSGS_AVAILABLE可以與任何其他MQGMO_*選項一起指定,也可以與任何MQMO_*選項一起指定。
在 z/OS上,專用及共用佇列支援此選項,但佇列必須具有 MQIT_GROUP_ID 的索引類型。 對於共用佇列,佇列對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。- 在下列平台上:
AIX
IBM i
Linux
Windows
- 如果同時指定這兩個選項,則只有在沒有現行群組或邏輯訊息時,
- MQGMO_ALL_SEGMENTS_AVAILABLE
- 只有在邏輯訊息中的所有區段都可用時,邏輯訊息中的區段才會變成可供擷取。 如果佇列包含部分區段遺漏的分段訊息 (可能是因為它們在網路中已延遲且尚未到達) ,則指定
MQGMO_ALL_SEGMENTS_AVAILABLE會阻止擷取屬於不完整邏輯訊息的區段。 不過,那些區段仍會構成 CurrentQDepth 佇列屬性的值; 這表示即使CurrentQDepth大於零,也可能沒有可擷取的邏輯訊息。 如果沒有其他可擷取的訊息,則在指定的等待間隔 (如果有的話) 過期之後會傳回原因碼MQRC_NO_MSG_AVAILABLE。MQGMO_ALL_SEGMENTS_AVAILABLE的處理取決於是否同時指定MQGMO_LOGICAL_ORDER:- 如果同時指定兩個選項,則只有在沒有現行邏輯訊息時,
MQGMO_ALL_SEGMENTS_AVAILABLE才會生效。 如果有現行邏輯訊息,則會忽略MQGMO_ALL_SEGMENTS_AVAILABLE。 這表示在以邏輯順序處理訊息時,MQGMO_ALL_SEGMENTS_AVAILABLE可以保持開啟狀態。 - 如果指定
MQGMO_ALL_SEGMENTS_AVAILABLE時未指定MQGMO_LOGICAL_ORDER,則MQGMO_ALL_SEGMENTS_AVAILABLE一律具有效果。 這表示在從佇列中移除邏輯訊息中的第一個區段之後,必須關閉選項,才能移除邏輯訊息中的其餘區段。
如果未指定此選項,則即使邏輯訊息不完整,也可以擷取訊息區段。
雖然
MQGMO_COMPLETE_MSG和MQGMO_ALL_SEGMENTS_AVAILABLE都需要所有區段都可用,才能擷取其中任何區段,但前者會傳回完整訊息,而後者則容許逐一擷取區段。如果針對報告訊息指定
MQGMO_ALL_SEGMENTS_AVAILABLE,則佇列管理程式會檢查佇列,以查看組成完整邏輯訊息的每一個區段是否至少有一個報告訊息。 如果有,則滿足MQGMO_ALL_SEGMENTS_AVAILABLE條件。 不過,佇列管理程式不會檢查報告訊息的 類型 ,因此在與邏輯訊息區段相關的報告訊息中可能會混合報告類型。 因此,MQGMO_ALL_SEGMENTS_AVAILABLE的成功並不表示MQGMO_COMPLETE_MSG會成功。 如果特定邏輯訊息的區段存在混合的報告類型,則必須逐一擷取這些報告訊息。您可以將MQGMO_ALL_SEGMENTS_AVAILABLE與任何其他MQGMO_*選項及任何MQMO_*選項一起指定。- 在 z/OS上,專用及共用佇列支援此選項,但佇列必須具有索引類型 MQIT_GROUP_ID。 對於共用佇列,佇列對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。
- 在下列平台上:
AIX
IBM i
Linux
Windows
- 如果同時指定兩個選項,則只有在沒有現行邏輯訊息時,
內容選項
- MQGMO_PROPERTIES_AS_Q_DEF
訊息的內容 (訊息描述子或延伸中的除外) 應該如 PropertyControl 佇列屬性所定義來表示。 如果提供
MsgHandle,則除非 PropertyControl 佇列屬性的值為MQPROP_FORCE_MQRFH2,否則會忽略此選項,且訊息的內容可透過MsgHandle取得。如果未指定內容選項,這是預設動作。
MQGMO_PROPERTIES_IN_HANDLE訊息的內容應該透過
MsgHandle提供。 如果未提供訊息控點,則呼叫會失敗,原因為MQRC_HMSG_ERROR。附註: 如果訊息稍後由未建立訊息控點的應用程式讀取,佇列管理程式會將任何訊息內容放入MQRFH2結構中。 您可能會發現存在非預期的MQRFH2標頭會破壞現有應用程式的行為。MQGMO_NO_PROPERTIES將不會擷取訊息的內容,但訊息描述子 (或延伸) 中包含的內容除外。 如果提供
MsgHandle,則會忽略它。MQGMO_PROPERTIES_FORCE_MQRFH2訊息的內容 (訊息描述子或延伸中的除外) 應該使用
MQRFH2標頭來表示。 對於預期擷取內容但無法變更為使用訊息控點的應用程式,這可提供與舊版的相容性。 如果提供MsgHandle,則會忽略它。MQGMO_PROPERTIES_COMPATIBILITY- 如果訊息包含字首為 "mcd."、 "jms."、 "usr."或 "mqext."的內容,則所有訊息內容都會遞送至
MQRFH2標頭中的應用程式。 否則訊息的所有內容(訊息描述子或延伸中的除外)都會被捨棄,而不再能供應用程式存取。
預設選項
- MQGMO_NONE
- 使用這個值來指出未指定其他選項;所有選項都採用其預設值。
MQGMO_NONE輔助工具程式文件; 此選項並非預期與任何其他選項搭配使用,但由於其值為零,因此無法偵測此類使用。
Options 欄位的起始值為 MQGMO_NO_WAIT 加號 MQGMO_PROPERTIES_AS_Q_DEF。