MQGMO 的選項 (MQLONG)

MQGMO 選項控制 MQGET的動作。 您可以指定零個以上選項。 如果您需要多個選用值:
  • 新增值 (不要多次新增相同的常數) ,或
  • 使用位元 OR 運算來結合值 (如果程式設計語言支援位元運算)。
會記錄無效的選項組合; 所有其他組合都是有效的。

等待選項

下列選項與等待訊息抵達佇列相關:
MQGMO_WAIT
應用程式會等待適當的訊息到達。 應用程式等待的時間上限指定在 WaitInterval中。
重要事項: 如果立即提供適當的訊息,則沒有等待或延遲。

如果禁止 MQGET 要求,或在等待時禁止 MQGET 要求,則會取消等待。 不論佇列上是否有適當的訊息,呼叫都會完成,並傳回 MQCC_FAILED 及原因碼 MQRC_GET_INHIBITED

您可以將 MQGMO_WAIT MQGMO_BROWSE_FIRST MQGMO_BROWSE_NEXT 選項搭配使用。

如果數個應用程式在相同的共用佇列上等待,則下列規則會選取當適當的訊息到達時要啟動的應用程式:

表 1. 在共用佇列上啟動 MQGET 呼叫的規則。
等待啟動的 MQGET 呼叫數 結果
使用 BROWSE 選項 沒有 BROWSE 選項 1
1 或更多 啟動一個沒有 BROWSE 選項的 MQGET 呼叫。
1 或更多 會啟動具有 BROWSE 選項的所有 MQGET 呼叫。
1 或更多 1 或更多 啟動一個沒有 BROWSE 選項的 MQGET 呼叫。 無法預期使用 BROWSE 選項啟動的 MQGET 呼叫數。
如果多個沒有 BROWSE 選項的 MQGET 呼叫正在相同佇列上等待,則只會啟動一個。 佇列管理程式會依下列順序嘗試提供等待呼叫的優先順序:
  1. 只有特定訊息 (例如,具有特定 MsgIdCorrelId (或兩者) 的訊息) 才能滿足的特定取得等待要求。
  2. 可由任何訊息滿足的一般 get-wait 要求。
附註:
  • 在第一個種類中,不會對更具體的 get-wait 要求提供額外的優先順序。 例如,同時指定 MsgIdCorrelId 的要求。
  • 在任一種類內,無法預測選取哪個應用程式。 特別是,等待時間最長的應用程式不一定是選取的應用程式。
  • 路徑長度及作業系統的優先順序排程考量,可能表示作業系統優先順序低於預期的等待中應用程式會擷取訊息。
  • 也可能發生未等待的應用程式優先於的應用程式擷取訊息。
[z/OS]z/OS®上,適用下列要點:
  • 如果您想要應用程式在等待訊息送達時繼續進行其他工作,請考慮改用信號選項 (MQGMO_SET_SIGNAL)。 不過,信號選項是環境特有的; 您在不同環境之間連接的應用程式不得使用它。
  • 如果有多個 MQGET 呼叫正在等待相同訊息,並混合等待及信號選項,則會平均考慮每一個等待中的呼叫。 將 MQGMO_SET_SIGNALMQGMO_WAIT一起指定是錯誤的。 將此選項與信號未處理的佇列控點一起指定也是錯誤。
  • 如果您針對 IndexTypeMQIT_MSG_TOKEN的佇列指定 MQGMO_WAITMQGMO_SET_SIGNAL ,則不允許任何選取準則。 這表示:
    • 如果您使用 version-1 MQGMO,請在 MQGET 呼叫 MQMI_NONEMQCI_NONE上指定的 MQMD 中設定 MsgIdCorrelId 欄位。
    • 如果您使用 version-2 或更新版本 MQGMO,請將 MatchOptions 欄位設為 MQMO_NONE
  • 對於共用佇列上的 MQGET 呼叫,且該呼叫是瀏覽要求或群組訊息的破壞性取得,且 MsgIdCorrelId 都不符合,則會在 200 毫秒之後公佈您的信號 ECB。

    當以 MQEC_WAIT_INTERVAL_EXPIRED 公佈佇列時,即使適當的訊息可能尚未到達佇列,也會發生此情況,直到等待間隔過期為止。 公佈 MQEC_MSG_RESIDE 時,您必須重新發出第二個 MQGET 呼叫來擷取訊息 (如果有的話)。

    此技術是用來確保及時通知您訊息到達,但在與非共用佇列上的類似呼叫序列相比較時,可能會顯示為非預期的處理額外負擔。

如果指定 MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_MSG_UNDER_CURSOR ,則會忽略 MQGMO_WAIT ; 不會引發任何錯誤。

MQGMO_NO_WAIT
如果沒有可用的適當訊息,應用程式不會等待。 MQGMO_NO_WAITMQGMO_WAIT相反。 MQGMO_NO_WAIT 定義為輔助程式文件。 如果都未指定,則它是預設值。
MQGMO_SET_SIGNAL
將此選項與 Signal1Signal2 欄位搭配使用。 它可讓應用程式在等待訊息到達時繼續進行其他工作。 它也容許 (如果有適當的作業系統機能可用) 應用程式等待訊息到達多個佇列。
附註: MQGMO_SET_SIGNAL 選項是環境特有的; 請勿將它用於您要連接的應用程式。
在兩種情況下,呼叫完成的方式與未指定此選項相同:
  1. 如果目前可用的訊息滿足訊息描述子中指定的準則。
  2. 如果偵測到參數錯誤或其他同步錯誤。

如果目前沒有符合訊息描述子中所指定準則的訊息可用,則控制會回到應用程式,而不等待訊息送達。 CompCodeReason 參數設為 MQCC_WARNINGMQRC_SIGNAL_REQUEST_ACCEPTED。 未設定訊息描述子中的其他輸出欄位以及 MQGET 呼叫的輸出參數。 當適當的訊息稍後到達時,會透過張貼歐洲央行來傳遞信號。

然後,呼叫者必須重新發出 MQGET 呼叫來擷取訊息。 應用程式可以使用作業系統提供的功能來等待此信號。

如果作業系統提供多重等待機制,您可以使用它來等待訊息到達數個佇列中的任何一個佇列。

如果指定非零 WaitInterval ,則會在等待間隔到期之後遞送信號。 佇列管理程式也可以取消等待,在此情況下會遞送信號。

多個 MQGET 呼叫可以為相同的訊息設定信號。 應用程式的啟動順序與 MQGMO_WAIT的說明相同。

如果多個 MQGET 呼叫正在等待相同的訊息,則會平均考慮每一個等待中的呼叫。 呼叫可以包含等待和信號選項的混合。

在特定條件下, MQGET 呼叫可以擷取訊息,並且可以遞送相同訊息到達所產生的信號。 當信號遞送時,應用程式必須準備好沒有可用的訊息。

佇列控點最多只能有一個信號要求未完成。

此選項不適用於下列任何選項:
  • MQGMO_UNLOCK
  • MQGMO_WAIT

對於共用佇列上的 MQGET 呼叫,且該呼叫是瀏覽要求或群組訊息的破壞性取得,且 MsgIdCorrelId 都不符合,使用者的信號 ECB 會在 200 毫秒之後 MQEC_MSG_ARRIVED 公佈。

即使適當的訊息可能尚未到達佇列,在等待間隔到期之前,當佇列隨 MQEC_WAIT_INTERVAL_EXPIRED一起公佈時,仍會發生此情況。 當 MQEC_MSG_ARRIVED 公佈時,您必須重新發出第二個 MQGET 呼叫來擷取訊息 (如果有的話)。

此技術是用來確保及時通知您訊息到達,但在與非共用佇列上的類似呼叫序列相比較時,可能會顯示為非預期的處理額外負擔。

當不常新增訊息時,這不是有效的訊息擷取方法。 為了避免瀏覽案例的額外負擔,請在 MQGET 呼叫上指定符合的 MsgId (如果未檢索或依 MsgId檢索) 或 CorrelId (如果依 CorrelId檢索)。

[z/OS]僅在 z/OS 上支援此選項。

MQGMO_FAIL_IF_QUIESCING
如果佇列管理程式處於靜止狀態,則強制 MQGET 呼叫失敗。

[z/OS]z/OS上,如果連線 (適用於 CICS®IMS 應用程式) 處於靜止狀態,則此選項也會強制 MQGET 呼叫失敗。

如果此選項與 MQGMO_WAITMQGMO_SET_SIGNAL一起指定,且在佇列管理程式進入靜止狀態時等待或信號未完成:
  • 取消等待,且呼叫會傳回完成碼 MQCC_FAILED ,原因碼為 MQRC_Q_MGR_QUIESCINGMQRC_CONNECTION_QUIESCING
  • 使用環境特定的信號完成碼來取消信號。

    [z/OS]z/OS上,信號會完成,事件完成碼為 MQEC_Q_MGR_QUIESCINGMQEC_CONNECTION_QUIESCING

如果未指定 MQGMO_FAIL_IF_QUIESCING ,且佇列管理程式或連線進入靜止狀態,則不會取消等待或信號。

同步點選項

下列選項與工作單元內 MQGET 呼叫的參與相關:
MQ GMO_同步點
要求是在正常工作單元通訊協定內運作。 訊息會標示為其他應用程式無法使用,但只有在確定工作單元時,才會從佇列中刪除它。 如果工作單元已取消,則訊息會重新變成可用。
您可以維持未設定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT 。 在此情況下,工作單元通訊協定中取得要求的併入由執行佇列管理程式的環境決定。 它不是由執行應用程式的環境所決定。
  • [z/OS]z/OS上,取得要求是在工作單元內。
  • z/OS以外的所有環境中,取得要求不在工作單元內。

由於這些差異,您想要埠的應用程式不得容許此選項預設; 請明確指定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT

此選項不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_LOCK
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
MQGMO_SYNCPOINT_IF_PERSISTENT
要求是在正常工作單元通訊協定內運作,但只有在擷取的訊息持續存在時才會執行。 持續訊息在 MQMDPersistence 欄位中具有值 MQPER_PERSISTENT
  • 如果訊息持續存在,佇列管理程式會如同應用程式已指定 MQGMO_SYNCPOINT一樣處理呼叫。
  • 如果訊息不是持續的,佇列管理程式會如同應用程式已指定 MQGMO_NO_SYNCPOINT一樣處理呼叫。
此選項不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_COMPLETE_MSG
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT
  • MQGMO_UNLOCK
此選項在下列環境中受支援:
  • [AIX]AIX®
  • [IBM i]IBM® i
  • [Linux]Linux®
  • [z/OS]z/OS
以及適用於已連接至這些系統的 IBM MQ MQI clients
MQGMO_NO_SYNCPOINT
要求是在正常工作單元通訊協定之外運作。 如果您收到沒有瀏覽選項的訊息,則會立即從佇列中刪除該訊息。 藉由取消工作單元,無法再次使訊息可供使用。

如果您指定 MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT,則會假設此選項。

您可以維持未設定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT 。 在此情況下,工作單元通訊協定中取得要求的併入由執行佇列管理程式的環境決定。 它不是由執行應用程式的環境所決定。
  • [z/OS]z/OS上,取得要求是在工作單元內。
  • z/OS以外的所有環境中,取得要求不在工作單元內。

由於這些差異,您要連接的應用程式不得容許此選項預設; 請明確指定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT

此選項不適用於下列任何選項:
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
[z/OS]MQGMO_MARK_SKIP_BACKOUT
在佇列上還原以這個選項標示的訊息,但不回復工作單元。

此選項僅在 z/OS上受支援。

如果指定此選項,則也必須指定 MQGMO_SYNCPOINTMQGMO_MARK_SKIP_BACKOUT 不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_LOCK
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
附註:IMSCICS上,您可能必須在取消包含標示為 MQGMO_MARK_SKIP_BACKOUT之訊息的工作單元之後,發出額外 IBM MQ 呼叫。 在確定包含所標示訊息的新工作單元之前,您必須先發出 IBM MQ 呼叫。 呼叫可以是您喜歡的任何 IBM MQ 呼叫。
  1. IMS上,如果您尚未套用 IMS APAR PN60855 ,且正在執行 IMS MPP 或 BMP 應用程式。
  2. CICS上,如果您正在執行任何應用程式。
在這兩種情況下,在確定包含已取消訊息的新工作單元之前,請先發出任何 IBM MQ 呼叫。
附註: 在工作單元內,只能有一個 get 要求標示為 skipping backout ,以及一個或數個未標示的 get 要求。

如果應用程式退出工作單元,則使用 MQGMO_MARK_SKIP_BACKOUT 擷取的訊息不會還原至其前一個狀態。 其他資源更新項目已取消。 訊息會被視為已在取消要求所啟動的新工作單元中擷取。 在沒有 MQGMO_MARK_SKIP_BACKOUT 選項的情況下擷取訊息。

如果在變更部分資源之後,工作單元顯然無法順利完成,則 MQGMO_MARK_SKIP_BACKOUT 非常有用。 如果您省略此選項,則取消工作單元會恢復佇列上的訊息。 下次擷取訊息時,會再次發生相同的事件順序。

不過,如果您在原始 MQGET 呼叫上指定 MQGMO_MARK_SKIP_BACKOUT ,則取消工作單元會取消其他資源的更新。 訊息會被視為已在新的工作單元下擷取。 應用程式可以執行適當的錯誤處理。 它可以將報告訊息傳送給原始訊息的傳送者,或將原始訊息放在無法傳送郵件的佇列上。 然後,它可以確定新的工作單元。 確定新的工作單元會從原始佇列永久移除訊息。

MQGMO_MARK_SKIP_BACKOUT 會標示單一實體訊息。 如果訊息屬於訊息群組,則不會標示群組中的其他訊息。 同樣地,如果標示的訊息是邏輯訊息的區段,則不會標示邏輯訊息中的其他區段。

可以標示群組中的任何訊息,但如果使用 MQGMO_LOGICAL_ORDER擷取訊息,則標示群組中的第一個訊息會很有利。 如果取消工作單元,則會將第一個 (標示的) 訊息移至新的工作單元。 會在佇列上恢復群組中的第二個及更新版本訊息。 另一個應用程式無法使用 MQGMO_LOGICAL_ORDER來擷取留在佇列上的訊息。 群組中的第一個訊息不再位於佇列上。 不過,支援工作單元的應用程式可以使用 MQGMO_LOGICAL_ORDER 選項,將第二個及稍後的訊息擷取至新的工作單元。 已擷取第一個訊息。

有時您可能需要退出新的工作單元。 例如,因為無法傳送郵件的佇列已滿,且不得捨棄訊息。 取消新的工作單元會恢復原始佇列上的訊息,這會防止訊息遺失。 不過,在此狀況下,無法繼續處理。 取消新的工作單元之後,應用程式必須通知操作員或管理者發生無法復原的錯誤,然後完成。

只有在包含 get 要求的工作單元因應用程式取消而岔斷時, MQGMO_MARK_SKIP_BACKOUT 才會運作。 如果包含 get 要求的工作單元因交易或系統失敗而取消,則會忽略 MQGMO_MARK_SKIP_BACKOUT 。 使用此選項擷取的任何訊息在佇列上恢復的方式與不使用此選項擷取的訊息恢復的方式相同。

瀏覽選項

下列選項與瀏覽佇列上的訊息相關:
MQGMO_BROWSE_FIRST
使用 MQOO_BROWSE 選項開啟佇列時,會建立瀏覽游標,並以邏輯方式放置在佇列上第一個訊息之前。 然後,您可以使用指定 MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXTMQGMO_BROWSE_MSG_UNDER_CURSOR 選項的 MQGET 呼叫,以非破壞性方式從佇列中擷取訊息。 瀏覽游標會標示佇列上的訊息內的位置,下一個 MQGET 呼叫 MQGMO_BROWSE_NEXT 會從該位置搜尋適當的訊息。
MQGMO_BROWSE_FIRST 不適用於下列任何選項:
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
如果未開啟佇列進行瀏覽,也會發生錯誤。

具有 MQGMO_BROWSE_FIRSTMQGET 呼叫會忽略瀏覽游標的前一個位置。 會擷取佇列上滿足訊息描述子中所指定條件的第一個訊息。 訊息會保留在佇列上,而瀏覽游標會定位在此訊息上。

在此呼叫之後,瀏覽游標會定位在已傳回的訊息上。 在發出具有 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_OKMQCC_WARNING,則用於瀏覽的群組和區段資訊會設為所傳回訊息的群組和區段資訊。 如果呼叫失敗,則群組及區段資訊會保持與呼叫之前的相同。

MQGMO_BROWSE_NEXT
將瀏覽游標前進至佇列上滿足 MQGET 呼叫上指定的選取準則的下一個訊息。 訊息會傳回至應用程式,但仍留在佇列上。
MQGMO_BROWSE_NEXT 不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
如果未開啟佇列進行瀏覽,也會發生錯誤。

如果 MQGMO_BROWSE_NEXT 是在開啟佇列以進行瀏覽之後第一個瀏覽佇列的呼叫,則其行為方式與 MQGMO_BROWSE_FIRST相同。

在發出下一個含有 MQGMO_BROWSE_NEXTMQGET 呼叫之前,可能會從佇列中移除游標下的訊息。 即使該位置現在是空的,瀏覽游標在邏輯上仍會保留在訊息所佔用的佇列中的位置。

訊息以兩種方式之一儲存在佇列上:
  • 優先順序 (MQMDS_PRIORITY) 內的 FIFO ,或
  • FIFO ,不論優先順序 (MQMDS_FIFO)
MsgDeliverySequence 佇列屬性指出套用的方法 (如需詳細資料,請參閱 佇列的屬性 )。

佇列的 MsgDeliverySequence 可能是 MQMDS_PRIORITY。 訊息到達佇列的優先順序高於瀏覽游標目前所指向的佇列。 在此情況下,在使用 MQGMO_BROWSE_NEXT對佇列進行現行清理期間,找不到較高優先順序的訊息。 只有在使用 MQGMO_BROWSE_FIRST重設瀏覽游標或重新開啟佇列之後,才能找到它。

必要的話, MQGMO_MSG_UNDER_CURSOR 選項可以與非瀏覽 MQGET 呼叫搭配使用,以從佇列中移除訊息。

使用相同 Hobj 控點的非瀏覽 MQGET 呼叫不會移動瀏覽游標。

在此選項中指定 MQGMO_LOCK 選項,以鎖定所瀏覽的訊息。

您可以將 MQGMO_BROWSE_NEXT 指定為 MQGMO_*MQMO_* 選項的任何有效組合,以控制邏輯訊息群組及區段中訊息的處理。

如果您指定 MQGMO_LOGICAL_ORDER,則會以邏輯順序瀏覽訊息。 如果您省略該選項,則會以實體順序瀏覽訊息。 如果您指定 MQGMO_BROWSE_FIRST,則可以在邏輯順序與實體順序之間切換。 使用 MQGMO_BROWSE_NEXT 的後續 MQGET 呼叫瀏覽佇列的順序,與為佇列控點指定 MQGMO_BROWSE_FIRST 的最新呼叫相同。 如果未滿足此條件,則呼叫會失敗,原因碼為 MQRC_INCONSISTENT_BROWSE

附註: 如果未指定 MQGMO_LOGICAL_ORDER ,當使用 MQGET 呼叫來瀏覽訊息群組尾端之後,請特別小心。 例如,假設群組中的最後一則訊息在佇列上群組中的第一個訊息之前。 使用 MQGMO_BROWSE_NEXT 來瀏覽群組結尾之後,指定 MQMO_MATCH_MSG_SEQ_NUMBER 並將 MsgSeqNumber 設為 1 會傳回群組中已瀏覽過的第一個訊息。 此結果可能會立即發生,如果有中間群組,則稍後可能會有一些 MQGET 呼叫。 相同的考量適用於不在群組中的邏輯訊息。

瀏覽呼叫的群組和區段資訊與從佇列中移除訊息之呼叫的資訊分開保留。

MQGMO_BROWSE_MSG_UNDER_CURSOR
擷取由瀏覽游標以非破壞性方式指向的訊息,不論 MQGMOMatchOptions 欄位中指定的 MQMO_* 選項為何。
MQGMO_BROWSE_MSG_UNDER_CURSOR 不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_NEXT
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
如果未開啟佇列進行瀏覽,也會發生錯誤。

瀏覽游標所指向的訊息是前次使用 MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT 選項擷取的訊息。 如果在此佇列開啟之後未對此佇列發出任何這些呼叫,則呼叫會失敗。 如果已破壞性地擷取瀏覽游標下的訊息,則呼叫也會失敗。

此呼叫不會變更瀏覽游標的位置。

MQGMO_MSG_UNDER_CURSOR 選項可以與非瀏覽 MQGET 呼叫搭配使用,以從佇列中移除訊息。

即使使用相同的 Hobj 控點,非瀏覽 MQGET 呼叫也不會移動瀏覽游標。 也不會由傳回完成碼 MQCC_FAILED或原因碼 MQRC_TRUNCATED_MSG_FAILED的瀏覽 MQGET 呼叫移動。

如果 MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_LOCK一起指定:
  • 如果已鎖定訊息,則它必須是游標下的訊息,因此會傳回該訊息,而不會再次解除鎖定及鎖定。 訊息會保持鎖定狀態。
  • 如果沒有已鎖定的訊息,且瀏覽游標下有訊息,則會鎖定並傳回給應用程式。 如果瀏覽游標下沒有訊息,則呼叫會失敗。
如果在未指定 MQGMO_LOCK的情況下指定 MQGMO_BROWSE_MSG_UNDER_CURSOR :
  • 如果已鎖定訊息,則必須是游標下的訊息。 訊息會傳回至應用程式,然後解除鎖定。 因為訊息現在已解除鎖定,所以不保證可以再次瀏覽它,或由相同的應用程式以破壞性方式擷取它。 另一個從佇列取得訊息的應用程式可能已破壞性地擷取它。
  • 如果沒有已鎖定的訊息,且瀏覽游標下有訊息,則會將它傳回給應用程式。 如果瀏覽游標下沒有訊息,則呼叫會失敗。

如果使用 MQGMO_BROWSE_MSG_UNDER_CURSOR指定 MQGMO_COMPLETE_MSG ,則瀏覽游標必須識別其 MQMD 中的 Offset 欄位為零的訊息。 如果未滿足此條件,則呼叫會失敗,原因碼為 MQRC_INVALID_MSG_UNDER_CURSOR

瀏覽呼叫的群組和區段資訊與從佇列中移除訊息之呼叫的資訊分開保留。

MQGMO_MSG_UNDER_CURSOR
擷取瀏覽游標所指向的訊息,不論 MQGMOMatchOptions 欄位中指定的 MQMO_* 選項為何。 從佇列中移除訊息。

瀏覽游標所指向的訊息是前次使用 MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT 選項擷取的訊息。

如果使用 MQGMO_MSG_UNDER_CURSOR指定 MQGMO_COMPLETE_MSG ,則瀏覽游標必須識別其 MQMD 中的 Offset 欄位為零的訊息。 如果未滿足此條件,則呼叫會失敗,原因碼為 MQRC_INVALID_MSG_UNDER_CURSOR

此選項不適用於下列任何選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_UNLOCK
如果未開啟佇列進行瀏覽及輸入,也會發生錯誤。 如果瀏覽游標目前未指向可擷取的訊息, MQGET 呼叫會傳回錯誤。
MQ GMO_MARK_BROWSE_HANDLE
即會標示成功 MQGET所傳回的訊息,或所傳回 MsgToken所識別的訊息。 標記特定於呼叫中使用的物件控點。

訊息未從佇列中移除。

只有在同時指定下列其中一個選項時, MQGMO_MARK_BROWSE_HANDLE 才有效:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
MQGMO_MARK_BROWSE_HANDLE 不適用於下列任何選項:
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_UNLOCK
訊息會保持此狀態,直到發生下列其中一個事件為止:
  • 所涉及的物件控點已正常關閉或以其他方式關閉。
  • 透過呼叫 MQGET 並使用選項 MQGMO_UNMARK_BROWSE_HANDLE,將此控點的訊息取消標示。
  • 此訊息從破壞性 MQGET的呼叫中傳回,該呼叫會完成 MQCC_OKMQCC_WARNING。 即使稍後回復 MQGET ,訊息狀態仍會維持變更。
  • 訊息到期。
MQGMO_MARK_BROWSE_CO_OP
由成功 MQGET傳回的訊息,或由傳回的 MsgToken識別的訊息,會針對協同作業集中的所有控點標示。

合作層次標記是除了任何可能已設定的控點層次標記之外的其他標記。

訊息未從佇列中移除。

只有在對指定 MQOO_CO_OPMQOPEN 的呼叫傳回所使用的物件控點時, MQGMO_MARK_BROWSE_CO_OP 才有效。 您也必須指定下列其中一個 MQGMO 選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
此選項不適用於下列任何選項:
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_UNLOCK

如果已標示訊息,且未指定 MQGMO_UNMARKED_BROWSE_MSG 選項,則呼叫會失敗,並傳回 MQCC_FAILED 及原因碼 MQRC_MSG_MARKED_BROWSE_CO_OP

訊息會保持此狀態,直到發生下列其中一個事件為止:
  • 會關閉協同作業集中的所有物件控點。
  • 透過使用選項 MQGMO_UNMARK_BROWSE_CO_OPMQGET 進行呼叫,將訊息取消標示為協同作業的瀏覽器。
  • 佇列管理程式會自動取消標示訊息。
  • 呼叫非瀏覽 MQGET會傳回此訊息。 即使稍後回復 MQGET ,訊息狀態仍會維持變更。
  • 訊息到期。
MQGMO_UNMARKED_BROWSE_MSG
指定 MQGMO_UNMARKED_BROWSE_MSGMQGET 呼叫會傳回視為未標示其控點的訊息。 如果訊息已標示為其控點,則不會傳回訊息。 如果佇列是由使用選項 MQOO_CO_OPMQOPEN的呼叫所開啟,且訊息已由協同作業集的成員標示,則它也不會傳回訊息。
此選項不適用於下列任何選項:
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_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_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_MARK_BROWSE_CO_OP
  • MQGMO_UNLOCK
  • MQGMO_UNMARKED_BROWSE_MSG
MQGMO_UNMARK_BROWSE_HANDLE
在呼叫指定此選項的 MQGET 之後,不再將找到的訊息視為已被此控點標示。

即使未標示此控點的訊息,呼叫仍會成功。

此選項在非瀏覽 MQGET 呼叫上無效,或具有下列任何選項:
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_MARK_BROWSE_CO_OP
  • MQGMO_UNLOCK
  • MQGMO_UNMARKED_BROWSE_MSG

鎖定選項

下列選項與鎖定佇列上的訊息相關:
MQGMO_LOCK
鎖定已瀏覽的訊息,使佇列開啟的任何其他控點都看不見該訊息。 只有在同時指定下列其中一個選項時,才能指定選項:
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_NEXT
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
每一個佇列控點只能鎖定一個訊息。 訊息可以是邏輯訊息或實體訊息:
  • 如果您指定 MQGMO_COMPLETE_MSG,則構成邏輯訊息的所有訊息區段都會鎖定至佇列控點。 訊息必須全部出現在佇列上且可供擷取。
  • 如果您省略 MQGMO_COMPLETE_MSG,則只會將單一實體訊息鎖定至佇列控點。 如果此訊息碰巧是邏輯訊息的區段,則已鎖定區段會阻止其他應用程式使用 MQGMO_COMPLETE_MSG 來擷取或瀏覽邏輯訊息。

鎖定訊息一律是瀏覽游標下的訊息。 稍後指定 MQGMO_MSG_UNDER_CURSOR 選項的 MQGET 呼叫可以從佇列中移除訊息。 其他使用佇列控點的 MQGET 呼叫也可以移除訊息 (例如,指定已鎖定訊息之訊息 ID 的呼叫)。

如果呼叫傳回完成碼 MQCC_FAILEDMQCC_WARNING ,原因碼為 MQRC_TRUNCATED_MSG_FAILED,則不會鎖定任何訊息。

如果應用程式未從佇列中移除訊息,則下列其中一個動作會釋放鎖定:
  • 對這個控點發出另一個 MQGET 呼叫,並指定 MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT。 如果呼叫以 MQCC_OKMQCC_WARNING完成,則會釋放鎖定。 如果呼叫完成並出現 MQCC_FAILED,則訊息會保持鎖定。 不過,下列異常狀況適用:
    • 如果 MQCC_WARNINGMQRC_TRUNCATED_MSG_FAILED一起傳回,則不會解除鎖定訊息。
    • 如果隨 MQRC_NO_MSG_AVAILABLE一起傳回 MQCC_FAILED ,則會解除鎖定訊息。

    如果您也指定 MQGMO_LOCK,則會鎖定傳回的訊息。 如果您省略 MQGMO_LOCK,則在呼叫之後不會有鎖定訊息。

    如果您指定 MQGMO_WAIT,且沒有立即可用的訊息,則在開始等待之前會解除鎖定原始訊息。

  • 使用 MQGMO_BROWSE_MSG_UNDER_CURSOR針對此控點發出另一個 MQGET 呼叫,但不使用 MQGMO_LOCK。 如果呼叫以 MQCC_OKMQCC_WARNING完成,則會釋放鎖定。 如果呼叫完成並出現 MQCC_FAILED,則訊息會保持鎖定。 不過,下列異常狀況適用:
    • 如果 MQCC_WARNINGMQRC_TRUNCATED_MSG_FAILED一起傳回,則不會解除鎖定訊息。
  • 使用 MQGMO_UNLOCK針對此控點發出另一個 MQGET 呼叫。
  • 使用控點發出 MQCLOSE 呼叫。 MQCLOSE 可能是隱含的,由應用程式結束所造成。
除了指定隨附的瀏覽選項所需的 MQOO_BROWSE之外,不需要任何特殊 MQOPEN 選項來指定 MQGMO_LOCK
MQGMO_LOCK 不適用於下列任何選項:
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
MQGMO_UNLOCK
要解除鎖定的訊息先前必須已由 MQGET 呼叫使用 MQGMO_LOCK 選項鎖定。 如果此控點未鎖定任何訊息,則呼叫會以 MQCC_WARNINGMQRC_NO_MSG_LOCKED完成。

如果您指定 MQGMO_UNLOCK,則不會檢查或變更 MsgDescBufferLengthBufferDataLength 參數。 Buffer中未傳回任何訊息。

指定 MQGMO_UNLOCK 不需要特殊開啟選項 (雖然首先需要 MQOO_BROWSE 才能發出鎖定要求)。

除了下列選項之外,此選項不適用於任何選項:
  • MQGMO_NO_WAIT
  • MQGMO_NO_SYNCPOINT
不論是否指定,都會假設這兩個選項。

訊息-資料選項

下列選項與從佇列讀取訊息時處理訊息資料相關:
MQGMO_ACCEPT_TRUNCATED_MSG
如果訊息緩衝區太小而無法保留完整訊息,請容許 MQGET 呼叫填入緩衝區。 MQGET 會盡可能在緩衝區中填入訊息。 它會發出警告完成碼,並完成其處理。 這表示:
  • 瀏覽訊息時,瀏覽游標會進階至傳回的訊息。
  • 移除訊息時,會從佇列中移除傳回的訊息。
  • 如果未發生其他錯誤,則會傳回原因碼 MQRC_TRUNCATED_MSG_ACCEPTED。
如果沒有這個選項,緩衝區仍會盡可能填滿訊息。 已發出警告完成碼,但未完成處理。 這表示:
  • 瀏覽訊息時,瀏覽游標不是進階的。
  • 移除訊息時,不會從佇列中移除訊息。
  • 如果未發生其他錯誤,則會傳回原因碼 MQRC_TRUNCATED_MSG_FAILED
MQ GMO_CONVERT
此選項會轉換訊息中的應用程式資料,以符合 MQGET 呼叫上 MsgDesc 參數中指定的 CodedCharSetIdEncoding 值。 在將資料複製到 Buffer 參數之前,會先轉換資料。
轉換處理程序會假設放置訊息時指定的 Format 欄位,以識別訊息中資料的本質。 訊息資料由佇列管理程式轉換成內建格式,並由使用者撰寫的結束程式轉換成其他格式。 如需資料轉換結束程式的詳細資料,請參閱 資料轉換結束程式
  • 如果轉換成功,則從 MQGET 呼叫返回時, MsgDesc 參數中指定的 CodedCharSetIdEncoding 欄位保持不變。
  • 如果僅轉換失敗,則會傳回未轉換的訊息資料。 MsgDesc 中的 CodedCharSetIdEncoding 欄位會設為未轉換訊息的值。 在此情況下,完成碼為 MQCC_WARNING
在任一情況下,這些欄位都會說明 Buffer 參數中所傳回訊息資料的字集 ID 及編碼。

請參閱 MQMD-訊息描述子 中說明的 Format 欄位,以取得佇列管理程式為其執行轉換的格式名稱清單。

群組和區段選項

下列選項與處理邏輯訊息群組及區段中的訊息相關。 在選項說明之前,以下是一些重要術語的定義:
實體訊息
實體訊息是可以放置在佇列上或從佇列中移除的最小資訊單元。 它通常對應於在單一 MQPUTMQPUT1MQGET 呼叫上指定或擷取的資訊。 每個實體訊息都有自己的訊息描述子 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中設定 GroupIdMsgSeqNumberOffset 欄位。 不過,應用程式必須在每次呼叫時正確設定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT 選項。

開啟佇列時,沒有現行訊息群組及現行邏輯訊息。 當 MQGET 呼叫傳回具有 MQMF_MSG_IN_GROUP 旗標的訊息時,訊息群組會變成現行訊息群組。 在連續呼叫上指定 MQGMO_LOGICAL_ORDER 之後,該群組會保留現行群組,直到傳回具有下列項目的訊息為止:
  • MQMF_LAST_MSG_IN_GROUP without MQMF_SEGMENT (亦即,群組中的最後一則邏輯訊息未分段) ,或
  • MQMF_LAST_MSG_IN_GROUP with MQMF_LAST_SEGMENT (亦即,傳回的訊息是群組中最後一個邏輯訊息的最後一個區段)。
當傳回這類訊息時,訊息群組會終止,且在順利完成 MQGET 呼叫時,不再有現行群組。 同樣地,當 MQGET 呼叫傳回具有 MQMF_SEGMENT 旗標的訊息時,邏輯訊息會變成現行邏輯訊息。 當傳回具有 MQMF_LAST_SEGMENT 旗標的訊息時,邏輯訊息會終止。
如果未指定選取準則,則連續的 MQGET 呼叫會以正確的順序傳回佇列上第一個訊息群組的訊息。 然後,它們會傳回第二個訊息群組的訊息,依此類推,直到沒有其他可用的訊息為止。 在 MatchOptions 欄位中指定下列一或多個選項,即可選取傳回的特定訊息群組:
  • MQMO_MATCH_MSG_ID
  • MQMO_MATCH_CORREL_ID
  • MQMO_MATCH_GROUP_ID
不過,只有在沒有現行訊息群組或邏輯訊息時,這些選項才有效。 如需進一步詳細資料,請參閱 MQGMO-Get-message 選項 中說明的 MatchOptions 欄位。
表 2 顯示當嘗試尋找要在 MQGET 呼叫中傳回的訊息時,佇列管理程式所尋找的 MsgIdCorrelIdGroupIdMsgSeqNumberOffset 欄位值。 這些規則適用於從佇列中移除訊息,以及瀏覽佇列上的訊息。 在表格中,表示「是」或「否」:
LOG ORD
指出是否在通話中指定 MQGMO_LOGICAL_ORDER 選項。
Cur grp
指出在呼叫之前是否存在現行訊息群組。
Cur log msg
指出在呼叫之前是否存在現行邏輯訊息。
其他直欄
顯示佇列管理程式所尋找的值。 「前一個」表示針對佇列控點前一個訊息中的欄位所傳回的值。
表 2. 與邏輯訊息群組及區段中的訊息相關的 MQGET 選項
您指定的選項 呼叫之前的群組和日誌訊息狀態 佇列管理程式尋找的值
LOG ORD Cur grp Cur log msg MsgId CorrelId GroupId MsgSeqNumber Offset
控制者 MatchOptions 控制者 MatchOptions 控制者 MatchOptions 1 0
任何訊息 ID 任何相關性 ID 前一個群組 ID 1 前一個偏移 + 前一個區段長度
任何訊息 ID 任何相關性 ID 前一個群組 ID 前一個序號 + 1 0
任何訊息 ID 任何相關性 ID 前一個群組 ID 前一個序號 前一個偏移 + 前一個區段長度
兩者擇一 兩者擇一 控制者 MatchOptions 控制者 MatchOptions 控制者 MatchOptions 控制者 MatchOptions 控制者 MatchOptions

如果佇列上存在多個訊息群組,且符合傳回資格,則會以每一個群組中第一個邏輯訊息之第一個區段的佇列位置所決定的順序來傳回群組。 亦即,訊息序號為 1 且偏移為 0 的實體訊息會決定傳回合格群組的順序。

MQGMO_LOGICAL_ORDER 選項會影響工作單元,如下所示:
  • 如果在工作單元內擷取群組中的第一個邏輯訊息或區段,則如果使用相同的佇列控點,則必須在工作單元內擷取群組中的所有其他邏輯訊息和區段。 不過,它們不需要在相同的工作單元內擷取。 這可讓由許多實體訊息組成的訊息群組,在佇列控點的兩個以上連續工作單元之間分割。
  • 如果未在工作單元內擷取群組中的第一個邏輯訊息或區段,且使用相同的佇列控點,則無法在工作單元內擷取群組中的任何其他邏輯訊息和區段。
如果未滿足這些條件,則 MQGET 呼叫會失敗,原因碼為 MQRC_INCONSISTENT_UOW

指定 MQGMO_LOGICAL_ORDER 時, MQGET 呼叫上提供的 MQGMO 不得小於 MQGMO_VERSION_2,且 MQMD 不得小於 MQMD_VERSION_2。 如果未滿足此條件,則呼叫會在適當的情況下失敗,原因碼為 MQRC_WRONG_GMO_VERSIONMQRC_WRONG_MD_VERSION

如果未針對佇列控點的連續 MQGET 呼叫指定 MQGMO_LOGICAL_ORDER ,則會傳回訊息,而不考慮它們是否屬於訊息群組,或它們是否為邏輯訊息的區段。 這表示來自特定群組或邏輯訊息的訊息或區段可能不正常傳回,或與來自其他群組或邏輯訊息的訊息或區段混合,或與不在群組中且不是區段的訊息混合。 在此狀況下,連續 MQGET 呼叫所傳回的特定訊息由那些呼叫上指定的 MQMO_* 選項控制 (如需這些選項的詳細資料,請參閱 MQGMO-Get-message 選項 中說明的 MatchOptions 欄位)。

這是在系統失效之後,可用來在中間重新啟動訊息群組或邏輯訊息的技術。 當系統重新啟動時,應用程式可以將 GroupIdMsgSeqNumberOffsetMatchOptions 欄位設為適當的值,然後發出 MQGET 呼叫並設定 MQGMO_SYNCPOINTMQGMO_NO_SYNCPOINT ,但不指定 MQGMO_LOGICAL_ORDER。 如果此呼叫成功,佇列管理程式會保留群組和區段資訊,後續使用該佇列控點的 MQGET 呼叫可以正常指定 MQGMO_LOGICAL_ORDER

佇列管理程式針對 MQGET 呼叫所保留的群組和區段資訊,與它針對 MQPUT 呼叫所保留的群組和區段資訊不同。 此外,佇列管理程式還會保留下列項目的個別資訊:
  • 從佇列中移除訊息的 MQGET 呼叫。
  • MQGET 呼叫可瀏覽佇列上的訊息。
對於任何給定的佇列控點,應用程式可以將指定 MQGMO_LOGICAL_ORDERMQGET 呼叫與未指定的 MQGET 呼叫混合。 不過,請注意下列要點:
  • 如果您省略 MQGMO_LOGICAL_ORDER,則每一個成功的 MQGET 呼叫都會導致佇列管理程式將已儲存的群組及區段資訊設為與所傳回訊息相對應的值; 這會取代佇列管理程式為佇列控點所保留的現有群組及區段資訊。 只會修改適用於呼叫動作 (瀏覽或移除) 的資訊。
  • 如果您省略 MQGMO_LOGICAL_ORDER,則當有現行訊息群組或邏輯訊息時,呼叫不會失敗; 呼叫可能會成功,並傳回 MQCC_WARNING 完成碼。 表 3 顯示可能產生的各種觀察值。 在這些情況下,如果完成碼不是 MQCC_OK,則原因碼是下列其中一項 (適當的話):
    • MQRC_INCOMPLETE_GROUP
    • MQRC_INCOMPLETE_MSG
    • MQRC_INCONSISTENT_UOW
    附註: 在瀏覽佇列時,或在關閉已開啟以進行瀏覽但未輸入的佇列時,佇列管理程式不會檢查群組及區段資訊; 在這些情況下,完成碼一律為 MQCC_OK (假設沒有其他錯誤)。
表 3. MQGET 或 MQCLOSE 呼叫與群組和區段資訊不一致時的結果
現行呼叫為 前一個呼叫是 MQGET ,使用 MQGMO_LOGICAL_ORDER 前一個通話是 MQGET 沒有 MQGMO_LOGICAL_ORDER
MQGETMQGMO_LOGICAL_ORDER MQCC_FAILED MQCC_FAILED
MQGET 沒有 MQGMO_LOGICAL_ORDER MQCC_WARNING MQCC_OK
MQCLOSE 具有未終止的群組或邏輯訊息 MQCC_WARNING MQCC_OK

建議以邏輯順序擷取訊息及區段的應用程式指定 MQGMO_LOGICAL_ORDER,因為這是最簡單的選項。 此選項可讓應用程式解除管理群組和區段資訊的需求,因為佇列管理程式會管理該資訊。 不過,特殊化應用程式可能需要比 MQGMO_LOGICAL_ORDER 選項所提供的更多控制,不指定該選項即可達成此目的。 然後,應用程式必須確保 MQMD中的 MsgIdCorrelIdGroupIdMsgSeqNumberOffset 欄位,以及 MQGMO中的 MatchOptions 中的 MQMO_* 選項,在每一個 MQGET 呼叫之前都正確設定。

例如,想要轉遞所接收實體訊息的應用程式,不論這些訊息是在邏輯訊息的群組或區段中,都不能指定 MQGMO_LOGICAL_ORDER。 在傳送與接收佇列管理程式之間具有多條路徑的複雜網路中,實體訊息可能不正常送達。 透過在 MQPUT 呼叫上既未指定 MQGMO_LOGICAL_ORDER,也未指定對應的 MQPMO_LOGICAL_ORDER ,轉遞應用程式可以在每一個實體訊息到達時立即擷取並轉遞它,而不需要等待邏輯順序中的下一個實體訊息到達。

在適當的情況下,您可以將 MQGMO_LOGICAL_ORDER 與任何其他 MQGMO_* 選項一起指定,以及與各種 MQMO_* 選項一起指定 (請參閱前一節)。
  • [z/OS]z/OS上,專用及共用佇列支援此選項,但佇列必須具有索引類型 MQIT_GROUP_ID。 對於共用佇列,佇列所對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。
  • 下列平台的所有本端佇列都支援此選項:
    • [AIX]AIX
    • [Linux]Linux
    • [IBM i]IBM i
    • [Windows]Windows
    以及對於連接至這些系統的 IBM MQ MQI clients ,。
MQ GMO_COMPLETE_MSG
MQGET 呼叫只能傳回完整邏輯訊息。 如果邏輯訊息已分段,則佇列管理程式會重新組合區段,並將完整的邏輯訊息傳回至應用程式; 擷取邏輯訊息的應用程式不會明顯看到邏輯訊息已分段的事實。
附註: 這是唯一讓佇列管理程式重新組合訊息區段的選項。 如果未指定,則如果區段存在於佇列上 (且滿足 MQGET 呼叫上指定的其他選取準則) ,則會將區段個別傳回給應用程式。 不想要接收個別區段的應用程式必須一律指定 MQGMO_COMPLETE_MSG

如果要使用這個選項,應用程式必須提供足夠大的緩衝區來容納完整訊息,或指定 MQGMO_ACCEPT_TRUNCATED_MSG 選項。

如果佇列包含部分區段遺漏的分段訊息 (可能是因為它們在網路中已延遲且尚未到達) ,則指定 MQGMO_COMPLETE_MSG 會阻止擷取屬於不完整邏輯訊息的區段。 不過,這些訊息區段仍會構成 CurrentQDepth 佇列屬性的值; 這表示即使 CurrentQDepth 大於零,也可能沒有可擷取的邏輯訊息。

對於持續訊息,佇列管理程式只能在工作單元內重新組合區段:
  • 如果 MQGET 呼叫在使用者定義的工作單元內運作,則會使用該工作單元。 如果在重組處理程序期間呼叫失敗,則佇列管理程式會在佇列上恢復在重組期間移除的任何區段。 不過,失敗並不會阻止順利確定工作單元。
  • 如果呼叫是在使用者定義工作單元之外運作,且沒有使用者定義工作單元存在,則佇列管理程式會在呼叫期間建立工作單元。 如果呼叫成功,佇列管理程式會自動確定工作單元 (應用程式不需要這麼做)。 如果呼叫失敗,佇列管理程式會取消工作單元。
  • 如果呼叫是在使用者定義工作單元之外運作,但存在使用者定義工作單元,則佇列管理程式無法重新組合。 如果訊息不需要重組,呼叫仍會成功。 但是如果訊息需要重組,則呼叫會失敗,原因碼為 MQRC_UOW_NOT_AVAILABLE

對於非持續訊息,佇列管理程式不需要工作單元即可執行重新組合。

每一個屬於區段的實體訊息都有自己的訊息描述子。 對於構成單一邏輯訊息的區段,訊息描述子中的大部分欄位對於邏輯訊息中的所有區段都是相同的; 通常只有 MsgIdOffsetMsgFlags 欄位在邏輯訊息中的區段之間會有所不同。 不過,如果區段放置在中間佇列管理程式的無法傳送郵件的佇列上,則 DLQ 處理程式會擷取指定 MQGMO_CONVERT 選項的訊息,這可能會導致變更區段的字集或編碼。 如果 DLQ 處理程式順利傳送區段,則區段可能具有字集或編碼,與區段到達目的地佇列管理程式時邏輯訊息中的其他區段不同。

CodedCharSetIdEncoding 欄位不同的區段所組成的邏輯訊息,無法由佇列管理程式重新組合成單一邏輯訊息。 相反地,佇列管理程式會重新組合並傳回邏輯訊息開頭的前幾個連續區段,這些區段具有相同的字集 ID 及編碼,且 MQGET 呼叫會適當地完成,並具有完成碼 MQCC_WARNING 及原因碼 MQRC_INCONSISTENT_CCSIDSMQRC_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_DATAMQRO_*_WITH_FULL_DATA 選項)。 如果區段存在的應用程式資料量小於完整數量,則會在傳回的報告訊息中以空值取代遺漏的位元組。

如果使用 MQGMO_MSG_UNDER_CURSORMQGMO_BROWSE_MSG_UNDER_CURSOR指定 MQGMO_COMPLETE_MSG ,則瀏覽游標必須位於其 MQMDOffset 欄位值為 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]z/OS上,專用及共用佇列支援此選項,但佇列必須具有 MQIT_GROUP_ID 的索引類型。 對於共用佇列,佇列對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。
  • 在下列平台上:
    • [AIX]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    以及對於連接至這些系統的 IBM MQ MQI clients ,所有本端佇列都支援此選項。
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_AVAILABLEMQGET 呼叫,表示在發出 MQGET 呼叫時,群組中的所有訊息都在佇列上。 不過,請注意,其他應用程式仍可以從群組中移除訊息 (該群組未鎖定至擷取群組中第一個訊息的應用程式)。

如果省略此選項,則即使群組不完整,也可以擷取屬於群組的訊息。

MQGMO_ALL_MSGS_AVAILABLE 默示 MQGMO_ALL_SEGMENTS_AVAILABLE,因此不需要指定。

MQGMO_ALL_MSGS_AVAILABLE 可以與任何其他 MQGMO_* 選項一起指定,也可以與任何 MQMO_* 選項一起指定。
  • [z/OS]z/OS上,專用及共用佇列支援此選項,但佇列必須具有 MQIT_GROUP_ID 的索引類型。 對於共用佇列,佇列對映的 CFSTRUCT 物件必須是 CFLEVEL (3) 或更高。
  • 在下列平台上:
    • [AIX]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    以及對於連接至這些系統的 IBM MQ MQI clients ,所有本端佇列都支援此選項。
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_MSGMQGMO_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]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    以及對於連接至這些系統的 IBM MQ MQI clients ,所有本端佇列都支援此選項。

內容選項

下列選項與訊息的內容相關:
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

1 指定 MQGMO_LOCK 選項的 MQGET 呼叫被視為非瀏覽呼叫。