MQOPEN-開啟物件
MQOPEN 呼叫會建立對物件的存取權。
- 佇列 (包括配送清單)
- 名稱清單
- 程序定義
- 佇列管理程式
- 主題
語法
MQOPEN (Hconn、 ObjDesc、 Options、 Hobj、 CompCode、 Reason)
參數
- Hconn
- 類型 :MQHCONN-輸入
此控點代表佇列管理程式的連線。 前一個 MQCONN 或 MQCONNX 呼叫已傳回
Hconn的值。在 z/OS® for CICS® 應用程式上,以及在 IBM® i for 以相容模式執行的應用程式上,可以省略 MQCONN 呼叫,並針對Hconn指定下列值:- MQHC_DEF_HCONN
- 預設連線控點。
- ObjDesc
- 類型 :MQOD-輸入/輸出
這是識別要開啟之物件的結構; 如需詳細資料,請參閱 MQOD-物件描述子 。
如果
ObjDesc參數中的ObjectName欄位是模型佇列的名稱,則會使用模型佇列的屬性建立動態本端佇列; 無論您在Options參數上指定任何選項,都會發生此情況。 使用 MQOPEN 呼叫所傳回之Hobj的後續作業是在新的動態佇列上執行,而不是在模型佇列上執行。 即使 MQINQ 和 MQSET 呼叫也是如此。ObjDesc參數中的模型佇列名稱會取代為所建立動態佇列的名稱。 動態佇列的類型由模型佇列的DefinitionType屬性值決定 (請參閱 佇列的屬性 )。 如需適用於動態佇列之關閉選項的相關資訊,請參閱 MQCLOSE 呼叫的說明。 - OPTIONS
- 類型 :MQLONG-輸入您必須至少指定下列其中一個選項:
- MQ 瀏覽
- MQOO_INPUT_ * (僅其中一項)
- MQOO_INQUIRE
- MQOO_OUTPUT
- MQOO_SET
- MQOO_BIND_ * (僅其中一項)
ObjDesc所指定物件類型的選項。 下表顯示查詢及主題的有效 MQOPEN 選項。選項 別名 1 本端及模型 遠端 非本端叢集 配送清單 主題 MQOO_INPUT_AS_Q_DEF 是 是 否 否 否 否 MQOO_INPUT_SHARED 是 是 否 否 否 否 MQOO_INPUT_EXCLUSIVE 是 是 否 否 否 否 MQOO_OUTPUT 是 是 是 是 是 是 MQOO_BROWSE 是 是 否 否 否 否 MQOO_CO_OP 是 是 否 否 否 否 MQOO_INQUIRE 是 是 2 是 否 否 MQOO_SET 是 是 2 否 否 否 MQOO_BIND_ON_OPEN 3 是 是 是 是 是 否 MQOO_BIND_NOT_FIXED 3 是 是 是 是 是 否 MQOO_BIND_ON_GROUP 3 是 是 是 是 是 否 MQOO_BIND_AS_Q_DEF 3 是 是 是 是 是 否 MQOO_SAVE_ALL_CONTEXT 是 是 否 否 否 否 MQOO_PASS_IDENTITY_CONTEXT 是 是 是 是 是 4 MQOO_PASS_ALL_CONTEXT 是 是 是 是 是 是 MQOO_SET_IDENTITY_CONTEXT 是 是 是 是 是 4 MQOO_SET_ALL_CONTEXT 是 是 是 是 是 是 MQOO_NO_READ_AHEAD 是 是 否 否 否 否 MQOO_READ_ahead 是 是 否 否 否 否 MQOO_READ_AHEAD_AS_Q_DEF 是 是 否 否 否 否 MQOO_ALTERNATE_USER_AUTHORITY 是 是 是 是 是 是 MQOO_FAIL_IF_QUIESCING 是 是 是 是 是 是 MQOO_RESOLVE_LOCAL_Q 是 是 是 是 否 否 MQOO_RESOLVE_LOCAL_TOPIC 否 否 否 否 否 是 MQOO_NO_多重播送 否 否 否 否 否 是 附註:- 別名選項的有效性取決於別名解析成的佇列選項的有效性。
- 此選項僅適用於遠端佇列的本端定義。
- 此選項可以指定給任何佇列類型,但如果佇列不是叢集佇列,則會被忽略。 不過,即使別名佇列不在叢集中,
DefBind佇列屬性也會置換基本佇列。 - 這些屬性可以與主題搭配使用,但只會影響保留訊息的環境定義集,不會影響傳送至任何訂閱者的環境定義欄位。
存取選項: 下列選項控制可對物件執行的作業類型:- MQOO_INPUT_AS_Q_DEF
- 開啟佇列以使用佇列定義的預設值來取得訊息。
開啟佇列以與後續 MQGET 呼叫搭配使用。 存取類型為共用或專用,視
DefInputOpenOption佇列屬性的值而定; 如需詳細資料,請參閱 佇列的屬性 。此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。
- MQOO_INPUT_SHARED
- 開啟佇列以取得具有共用存取權的訊息。
開啟佇列以與後續 MQGET 呼叫搭配使用。 如果佇列目前由這個或另一個具有 MQOO_INPUT_SHARED 的應用程式開啟,則呼叫會成功,但如果佇列目前以 MQOO_INPUT_EXCLUSIVE 開啟,則會失敗,原因碼為 MQRC_OBJECT_IN_USE。
此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。
- MQOO_INPUT_EXCLUSIVE
- 開啟佇列以取得具有專用存取權的訊息。
開啟佇列以與後續 MQGET 呼叫搭配使用。 如果佇列目前由這個或另一個應用程式開啟以進行任何類型的輸入 (MQOO_INPUT_SHARED 或 MQOO_INPUT_EXCLUSIVE) ,則呼叫會失敗,原因碼為 MQRC_OBJECT_IN_USE。
此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。
- MQOO_OUTPUT
開啟佇列以放置訊息,或開啟主題或主題字串以發佈訊息。
開啟佇列或主題,以便與後續的 MQPUT 呼叫搭配使用。
即使
InhibitPut佇列屬性設為 MQQA_PUT_INHIBITED ,具有此選項的 MQOPEN 呼叫仍會成功 (雖然屬性設為此值時後續 MQPUT 呼叫會失敗)。此選項適用於所有類型的佇列,包括配送清單及主題。
下列注意事項適用於這些選項:- 只能指定其中一個選項。
- 即使
InhibitGet佇列屬性設為 MQQA_GET_INHIBITED (雖然屬性設為此值時後續 MQGET 呼叫會失敗) ,具有下列其中一個選項的 MQOPEN 呼叫仍會成功。 - 如果佇列定義為不可共用 (亦即,
Shareability佇列屬性具有值 MQQA_NOT_SHAREABLE) ,則嘗試開啟共用存取權的佇列會被視為嘗試開啟具有專用存取權的佇列。 - 如果使用下列其中一個選項開啟別名佇列,則專用 (或另一個應用程式是否具有專用) 的測試會針對別名所解析成的基本佇列。
- 如果
ObjectQMgrName是佇列管理程式別名,則這些選項無效; 即使用於佇列管理程式別名化之遠端佇列的本端定義中的RemoteQMgrName屬性值是本端佇列管理程式的名稱,也是如此。
- MQOO_BROWSE
- 開啟佇列以瀏覽訊息。使用下列其中一個選項開啟佇列,以與後續 MQGET 呼叫搭配使用:
- MQGMO_BROWSE_FIRST
- MQGMO_BROWSE_NEXT
- MQGMO_BROWSE_MSG_UNDER_CURSOR
此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。 如果
ObjectQMgrName是佇列管理程式別名,則它也無效; 即使用於佇列管理程式別名化之遠端佇列的本端定義中的RemoteQMgrName屬性值是本端佇列管理程式的名稱,也是如此。 - MQOO_CO_OP
- 開啟為一組控點的合作成員。
此選項僅適用於 MQOO_BROWSE 選項。 如果未指定 MQOO_BROWSE ,則 MQOPEN 會傳回 MQRC_OPTIONS_ERROR。
傳回的控點被視為具有下列其中一個選項之後續 MQGET 呼叫的一組協同作業控點的成員:- MQGMO_MARK_BROWSE_CO_OP
- MQGMO_UNMARKED_BROWSE_MSG
- MQGMO_UNMARK_BROWSE_CO_OP
此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。
- MQOO_INQUIRE
- 開啟物件以查詢屬性。
開啟佇列、名單、程序定義或佇列管理程式,以與後續 MQINQ 呼叫搭配使用。
此選項適用於配送清單以外的所有物件類型。 如果
ObjectQMgrName是佇列管理程式別名,則無效; 即使用於佇列管理程式別名化之遠端佇列的本端定義中的RemoteQMgrName屬性值是本端佇列管理程式的名稱,也是如此。 - MQOO_SET
- 開啟佇列以設定屬性。
開啟佇列以與後續的 MQSET 呼叫搭配使用。
此選項對配送清單以外的所有佇列類型有效。 如果
ObjectQMgrName是遠端佇列的本端定義名稱,則無效; 即使用於佇列管理程式別名化之遠端佇列的本端定義中的RemoteQMgrName屬性值是本端佇列管理程式的名稱,也是如此。
連結選項: 當開啟的物件是叢集佇列時,下列選項適用; 這些選項控制佇列控點與叢集佇列實例的連結:- MQOO_BIND_ON_OPEN
- 當開啟佇列時,本端佇列管理程式會將佇列控點連結至目的地佇列的實例。 因此,使用此控點放置的所有訊息都會透過相同的路徑傳送至目的地佇列的相同實例。
此選項僅適用於佇列,且僅影響叢集佇列。 如果指定給非叢集佇列的佇列,則會忽略該選項。
- MQOO_BIND_NOT_FIXED
- 這會停止將佇列控點連結至目的地佇列實例的本端佇列管理程式。 因此,使用此控點的連續 MQPUT 呼叫會將訊息傳送至目的地佇列的 不同 實例,或透過不同的路徑傳送至相同實例。 它還容許稍後由本端佇列管理程式、遠端佇列管理程式或訊息通道代理程式 (MCA) 根據網路狀況變更所選取的實例。附註: 需要交換 系列 訊息以完成交易的用戶端及伺服器應用程式不得使用 MQOO_BIND_NOT_FIXED (或 MQOO_BIND_AS_Q_DEF ,當
DefBind具有 MQBND_BIND_NOT_FIXED 值時) ,因為系列中的連續訊息可能會傳送至伺服器應用程式的不同實例。如果為叢集佇列指定 MQOO_BROWSE 或其中一個 MQOO_Input_ * 選項,則會強制佇列管理程式選取叢集佇列的本端實例。 因此,即使指定 MQOO_BIND_NOT_FIXED ,也會修正佇列控點的連結。
如果 MQOO_INQUIRE 與 MQOO_BIND_NOT_FIXED 一起指定,則使用該控點的後續 MQINQ 呼叫可能會查詢叢集佇列的不同實例,雖然通常所有實例都具有相同的屬性值。
MQOO_BIND_NOT_FIXED 僅對佇列有效,僅影響叢集佇列。 如果指定給非叢集佇列的佇列,則會忽略該選項。
- MQ OO_BIND_ON_GROUP
- 容許應用程式要求將訊息群組全部配置給相同的目的地實例。
此選項僅適用於佇列,且僅影響叢集佇列。 如果指定給非叢集佇列的佇列,則會忽略該選項。
- MQOO_BIND_AS_Q_DEF
- 本端佇列管理程式會以
DefBind佇列屬性所定義的方式來連結佇列控點。 此屬性的值為 MQBND_BIND_ON_OPEN、MQBND_BIND_NOT_FIXED 或 MQBND_BIND_ON_GROUP。當未指定 MQOO_BIND_ON_OPEN、MQOO_BIND_NOT_FIXED 或 MQOO_BIND_ON_GROUP 時, MQOO_BIND_AS_Q_DEF 是預設值。
MQOO_BIND_AS_Q_DEF 輔助程式說明文件。 此選項不是要與其他兩個連結選項中的任何一個搭配使用,但因為其值為零,所以無法偵測到這類使用。
環境定義選項: 下列選項控制訊息環境定義的處理:- MQOO_SAVE_ALL_CONTEXT
- 環境定義資訊與此佇列控點相關聯。 此資訊是從使用此控點所擷取之任何訊息的環境定義中設定。 如需訊息環境定義的相關資訊,請參閱 訊息環境定義 及 控制環境定義資訊。
此環境定義資訊可以傳遞至訊息,然後使用 MQPUT 或 MQPUT1 呼叫將訊息放置在佇列上。 請參閱 MQPMO-Put-message 選項中說明的 MQPMO_PASS_IDENTITY_CONTEXT 及 MQPMO_PASS_ALL_CONTEXT 選項。
在順利擷取訊息之前,無法將環境定義傳遞至放置在佇列上的訊息。
使用其中一個 MQGMO_BROWSE_ * 瀏覽選項擷取的訊息未儲存其環境定義資訊 (雖然在瀏覽之後會設定
MsgDesc參數中的環境定義欄位)。此選項僅適用於本端、別名及模型佇列; 它不適用於遠端佇列、配送清單及非佇列的物件。 必須指定其中一個 MQOO_INPUT_ * 選項。
- MQOO_PASS_IDENTITY_CONTEXT
- 當訊息放置在佇列上時,這可讓您在
PutMsgOpts參數中指定 MQPMO_PASS_IDENTITY_CONTEXT 選項; 這會提供訊息來自以 MQOO_SAVE_ALL_CONTEXT 選項開啟之輸入佇列的身分環境定義資訊。 如需訊息環境定義的相關資訊,請參閱 訊息環境定義 及 控制環境定義資訊。必須指定 MQOO_OUTPUT 選項。
此選項適用於所有類型的佇列,包括配送清單。
- MQOO_PASS_ALL_CONTEXT
- 這容許在將訊息放置在佇列上時,在
PutMsgOpts參數中指定 MQPMO_PASS_ALL_CONTEXT 選項; 這會為訊息提供使用 MQOO_SAVE_ALL_CONTEXT 選項開啟的輸入佇列中的身分及原始環境定義資訊。 如需訊息環境定義的相關資訊,請參閱 訊息環境定義 及 控制環境定義資訊。此選項暗示 MQOO_PASS_IDENTITY_CONTEXT ,因此不需要指定。 必須指定 MQOO_OUTPUT 選項。
此選項適用於所有類型的佇列,包括配送清單。
- MQOO_SET_IDENTITY_CONTEXT
- 這容許在將訊息放入佇列時,在
PutMsgOpts參數中指定 MQPMO_SET_IDENTITY_CONTEXT 選項; 這會為訊息提供在 MQPUT 或 MQPUT1 呼叫上指定的MsgDesc參數中包含的身分環境定義資訊。 如需訊息環境定義的相關資訊,請參閱 訊息環境定義 及 控制環境定義資訊。此選項暗示 MQOO_PASS_IDENTITY_CONTEXT ,因此不需要指定。 必須指定 MQOO_OUTPUT 選項。
此選項適用於所有類型的佇列,包括配送清單。
- MQOO_SET_ALL_CONTEXT
- 當訊息放置在佇列上時,這容許在
PutMsgOpts參數中指定 MQPMO_SET_ALL_CONTEXT 選項; 這會為訊息提供 MQPUT 或 MQPUT1 呼叫所指定MsgDesc參數中包含的身分及原始環境定義資訊。 如需訊息環境定義的相關資訊,請參閱 訊息環境定義 及 控制環境定義資訊。此選項表示下列選項,因此不需要指定這些選項:- MQOO_PASS_IDENTITY_CONTEXT
- MQOO_PASS_ALL_CONTEXT
- MQOO_SET_IDENTITY_CONTEXT
此選項適用於所有類型的佇列,包括配送清單。
先讀選項:
當呼叫 MQOPEN 與 MQOO_READ_AHEAD 時,IBM MQ 用戶端只會在符合特定條件時啟用先讀。 這些條件包括:- 用戶端和遠端佇列管理程式都必須是 WebSphere® MQ 第 7 版或更新版本。
- 用戶端應用程式必須與執行緒 IBM MQ MQI 用戶端程式庫進行編譯及鏈結。
- 用戶端通道必須使用 TCP/IP 通訊協定。
- 該通道必須在用戶端和伺服器通道定義中都具有非零 SharingConversations (SHARECNV) 設定。
下列選項控制在應用程式要求非持續訊息之前,是否將它們傳送至用戶端。 下列附註適用於先讀選項:- 只能指定其中一個選項。
- 這些選項僅適用於本端、別名及模型佇列。 它們對遠端佇列、配送清單、主題或佇列管理程式無效。
- 僅當同時指定 MQOO_BROWSE、MQOO_INPUT_SHARED 及 MQOO_INPUT_EXCLUSIVE 其中之一時,這些選項才適用,雖然使用 MQOO_INQUIRE 或 MQOO_SET 指定這些選項不是錯誤。
- 如果應用程式不是作為 IBM MQ 用戶端執行,則會忽略這些選項。
其他選項: 下列選項控制授權檢查、佇列管理程式靜止時發生的情況、是否解析本端佇列名稱及多重播送:- MQOO_ALTERNATE_USER_AUTHORITY
ObjDesc參數中的AlternateUserId欄位包含用來驗證此 MQOPEN 呼叫的使用者 ID。 只有在此AlternateUserId獲授權以指定的存取選項開啟物件時,不論執行應用程式的使用者 ID 是否獲授權開啟物件,呼叫才會成功。 這不適用於任何指定的環境定義選項,不過,一律會根據執行應用程式的使用者 ID 來檢查這些選項。此選項適用於所有類型的物件。
- MQOO_FAIL_IF_QUIESCING
- 如果佇列管理程式處於靜止狀態,則 MQOPEN 呼叫會失敗。
在 z/OS上,對於 CICS 或 IMS 應用程式,如果連線處於靜止狀態,此選項也會強制 MQOPEN 呼叫失敗。
此選項適用於所有類型的物件。
如需用戶端通道的相關資訊,請參閱 IBM MQ MQI clients概觀。
- MQOO_RESOLVE_LOCAL_Q
- 以已開啟的本端佇列名稱填入 MQOD 結構中的 ResolvedQName 。 同樣地, ResolvedQMgr名稱會填入管理本端佇列的本端佇列管理程式名稱。 如果 MQOD 結構小於第 3 版,則會忽略 MQOO_RESOLVE_LOCAL_Q ,且不會傳回任何錯誤。
當開啟本端、別名或模型佇列時,一律會傳回本端佇列,但例如,當開啟遠端佇列或非本端叢集佇列而沒有使用 MQOO_RESOLVE_LOCAL_Q 選項時,不會傳回這種情況; ResolvedQName 和 ResolvedQMgr名稱會填入在遠端佇列定義中找到的 RemoteQName 和 RemoteQMgr名稱,或類似所選擇的遠端叢集佇列。
如果您在開啟時指定 MQOO_RESOLVE_LOCAL_Q (例如,遠端佇列) ,則 ResolvedQName 是放置訊息的傳輸佇列。 ResolvedQMgr名稱會填入管理傳輸佇列的本端佇列管理程式名稱。
如果您已獲授權在佇列上瀏覽、輸入或輸出,則具有在 MQOPEN 呼叫上指定此旗標的必要權限。 不需要特殊權限。
此選項僅適用於佇列及佇列管理程式。
- MQOO_RESOLVE_LOCAL_TOPIC
- 以開啟的管理主題名稱填入 MQOD 結構中的 ResolvedQName 。
- MQOO_NO_MULTICAST
- 不使用多重播送來傳送發佈訊息。
此選項僅適用於 MQOO_OUTPUT 選項。 如果未指定 MQOO_OUTPUT ,則 MQOPEN 會傳回 MQRC_OPTIONS_ERROR。
此選項僅適用於主題。
- HOBJ
- 類型 :MQHOBJ-輸出
此控點代表已建立對物件的存取權。 必須在對物件進行操作的後續 IBM MQ 呼叫中指定它。 當發出 MQCLOSE 呼叫時,或當定義控點範圍的處理單元終止時,它就不再有效。
傳回的物件控點範圍與呼叫上指定的連線控點範圍相同。 如需控點範圍的相關資訊,請參閱 MQCONN-Hconn 參數 。
- CompCode
- 類型 :MQLONG-輸出完成碼; 它是下列其中一項:
- MQCC_OK
- 順利完成。
- MQCC_WARNING
- 警告 (局部完成)。
- MQCC_FAILED
- 呼叫失敗。
- 原因
- 類型 :MQLONG-輸出
定義
CompCode的原因碼。如果CompCode是 MQCC_OK:- MQRC_NONE
- (0 , X'000 ') 沒有理由報告。
如果CompCode是 MQCC_WARNING:- MQRC_MULTIPLE_REASONS
- (2136 , X'858 ') 傳回多個原因碼。
如果CompCode是 MQCC_FAILED:- MQRC_ADAPTER_NOT_AVAILABLE
- (2204 , X'89C') 配接卡無法使用。
- MQRC_ADAPTER_SERV_LOAD_ERROR
- (2130 , X'852 ') 無法載入配接卡服務模組。
- MQRC_ALIAS_BASE_Q_TYPE_ERROR
- (2001 , X'7D1') 別名基本佇列不是有效的類型。
- MQRC_API_EXIT_ERROR
- (2374 , X' 946 ') API 結束程式失敗。
- MQRC_API_EXIT_LOAD_ERROR
- (2183 , X'887 ') 無法載入 API 結束程式。
- MQRC_ASDID_MISMATCH
- (2157 , X'86D') 主要和起始 ASID 不同。
- MQRC_CALL_IN_PROGRESS
- (2219 , X'8AB') 在前一個呼叫完成之前輸入的 MQI 呼叫。
- 無法使用 MQRC_CF_NOT_AVAILABLE
- (2345 , X' 929 ') 無法使用連結機能。
- MQRC_CF_STRUC_AUTH_FAILED
- (2348 , X'92C') 連結機能結構授權檢查失敗。
- MQRC_CF_STRUC_ERROR
- (2349 , X'92D') 連結機能結構無效。
- MQRC_CF_STRUC_FAILED
- (2373 , X' 945 ') 連結機能結構失敗。
- MQRC_CF_STRUC_IN_USE
- (2346 , X'92A') 連結機能結構使用中。
- MQRC_CF_STRUC_LIST_HDR_IN_USE
- (2347 , X'92B') 連結機能結構清單標頭使用中。
- MQRC_CICS_WAIT_FAILED
- (2140 , X'85C') 等待要求被 CICS拒絕。
- MQRC_CLUSTER_EXIT_ERROR
- (2266 , X'8DA') 叢集工作量結束程式失敗。
- MQRC_CLUSTER_PUT_INHIBITED
- (2268 , X'8DC') 禁止叢集中所有佇列的 Put 呼叫。
- MQRC_CLUSTER_RESOLUTION_ERROR
- (2189 , X'88D') 叢集名稱解析失敗。
- MQRC_CLUSTER_RESOURCE_ERROR
- (2269 , X'8DD') 叢集資源錯誤。
- MQRC_CONNECTION_BROKEN
- (2009 , X'7D9') 與佇列管理程式的連線遺失。
- MQRC_CONNECTION_NOT_AUTHORIZED
- (2217 , X'8A9') 未獲連線授權。
- MQRC_CONNECTION_QUIESCING
- (2202 , X'89A') 連線靜止。
- MQRC_CONNECTION_STOPPING
- (2203 , X'89B') 連線關閉。
- MQRC_DB2_NOT_AVAILABLE
- (2342 , X' 926 ') Db2® 子系統無法使用。
- MQRC_DEF_XMIT_Q_TYPE_ERROR
- (2198 , X'896 ') 預設傳輸佇列不是本端。
- MQRC_DEF_XMIT_Q_USAGE_ERROR
- (2199 , X'897 ') 預設傳輸佇列使用錯誤。
- MQRC_DYNAMIC_Q_NAME_ERROR
- (2011 , X'7DB') 動態佇列名稱無效。
- MQRC_HANDLE_NOT_AVAILABLE
- (2017 , X'7E1') 沒有可用的控點。
- MQRC_HCONN_ERROR
- (2018 , X'7E2') 連線控點無效。
- MQRC_HOBJ_ERROR
- (2019 , X'7E3') 物件控點無效。
- MQRC_MULTIPLE_REASONS
- (2136 , X'858 ') 傳回多個原因碼。
- MQRC_NAME_IN_USE
- (2201 , X'899 ') 名稱使用中。
- MQRC_NAME_NOT_VALID_FOR_TYPE
- (2194 , X'892 ') 物件名稱對物件類型無效。
- MQRC_NOT_AUTHORIZED
- (2035 , X'7F3') 未獲授權存取。
- MQRC_OBJECT_ALREADY_EXISTS
- (2100 , X'834 ') 物件存在。
- MQRC_OBJECT_DAMAGED
- (2101 , X'835 ') 物件已損壞。
- MQRC_OBJECT_IN_USE
- (2042 , X'7FA') 已使用衝突選項開啟物件。
- MQRC_OBJECT_LEVEL_INCOMPATIBLE
- (2360 , X' 938 ') 物件層次不相容。
- MQRC_OBJECT_NAME_ERROR
- (2152 , X'868 ') 物件名稱無效。
- MQRC_OBJECT_NOT_UNIQUE
- (2343 , X' 927 ') 物件不是唯一的。
- MQRC_OBJECT_Q_MGR_NAME_ERROR
- (2153 , X'869 ') 物件佇列管理程式名稱無效。
- MQRC_OBJECT_RECORDS_ERROR
- (2155 , X'86B') 物件記錄無效。
- MQRC_OBJECT_STRING_ERROR
- (2441 , X'0989 ') Objectstring 欄位無效
- MQRC_OBJECT_TYPE_ERROR
- (2043 , X'7FB') 物件類型無效。
- MQRC_OD_ERROR
- (2044 , X'7FC') 物件描述子結構無效。
- MQRC_OPTION_NOT_VALID_FOR_TYPE
- (2045 , X'7FD') 選項對物件類型無效。
- MQRC_OPTIONS_ERROR
- (2046 , X'7FE') 選項無效或不一致。
- MQRC_PAGESET_ERROR
- (2193 , X'891 ') 存取頁集資料集時發生錯誤。
- MQRC_PAGESET_FULL
- (2192 , X'890 ') 外部儲存媒體已滿。
- MQRC_Q_DELETED
- (2052 , X'804 ') 已刪除佇列。
- MQRC_Q_MGR_NAME_ERROR
- (2058 , X'80A') 佇列管理程式名稱無效或不明。
- MQRC_Q_MGR_NOT_AVAILABLE
- (2059 , X'80B') 佇列管理程式無法用於連線。
- MQRC_Q_MGR_QUIESCING
- (2161 , X'871 ') 佇列管理程式靜止中。
- MQRC_Q_MGR_STOPPING
- (2162 , X'872 ') 佇列管理程式關閉。
- MQRC_Q_TYPE_ERROR
- (2057 , X'809 ') 佇列類型無效。
- MQRC_RECS_PRESENT_ERROR
- (2154 , X'86A') 存在的記錄數無效。
- MQRC_REMOTE_Q_NAME_ERROR
- (2184 , X'888 ') 遠端佇列名稱無效。
- MQRC_RESOURCE_PROBLEM
- (2102 , X'836 ') 可用的系統資源不足。
- MQRC_RESPONSE_RECORDS_ERROR
- (2156 , X'86C') 回應記錄無效。
- MQRC_SECURITY_ERROR
- (2063 , X'80F') 發生安全錯誤。
- MQRC_SELECTOR_SYNTAX_ERROR
- 2459 (X'099B') 已發出 MQOPEN、 MQPUT1 或 MQSUB 呼叫,但指定了包含語法錯誤的選取字串。
- MQRC_STOPPED_BY_CLUSTER_EXIT
- (2188 , X'88C') 叢集工作量結束程式拒絕呼叫。
- MQRC_STORAGE_MEDIUM_FULL
- (2192 , X'890 ') 外部儲存媒體已滿。
- MQRC_STORAGE_NOT_AVAILABLE
- (2071 , X'817 ') 可用的儲存體不足。
- MQRC_SUPPRESSED_BY_EXIT
- (2109 , X'83D') 跳出程式暫停呼叫。
- MQRC_UNEXPECTED_ERROR
- (2195 , X'893 ') 發生非預期的錯誤。
- MQRC_UNKNOWN_ALIAS_BASE_Q
- (2082 , X'822 ') 不明別名基本佇列。
- MQRC_UNKNOWN_DEF_XMIT_Q
- (2197 , X'895 ') 不明預設傳輸佇列。
- MQRC_UNKNOWN_OBJECT_NAME
- (2085 , X'825 ') 不明物件名稱。
- MQRC_UNKNOWN_OBJECT_Q_MGR
- (2086 , X'826 ') 不明物件佇列管理程式。
- MQRC_UNKNOWN_REMOTE_Q_MGR
- (2087、X'827 ') 不明遠端佇列管理程式。
- MQRC_UNKNOWN_XMIT_Q
- (2196、X'894 ') 不明傳輸佇列。
- MQRC_WRONG_CF_LEVEL
- (2366 , X'93E') 連結機能結構層次錯誤。
- MQRC_XMIT_Q_TYPE_ERROR
- (2091 , X'82B') 傳輸佇列不是本端。
- MQRC_XMIT_Q_USAGE_ERROR
- (2092 , X'82C') 使用錯誤的傳輸佇列。
如需這些代碼的詳細資訊,請參閱:- IBM MQ for z/OS的
IBM MQ for z/OS 訊息、完成及原因碼 。 - 除了 z/OS之外,所有其他 IBM MQ 平台的 訊息及原因碼 。
一般使用注意事項
- 開啟的物件是下列其中一項:
- 佇列至:
- 取得或瀏覽訊息 (使用 MQGET 呼叫)
- 放置訊息 (使用 MQPUT 呼叫)
- 查詢佇列的屬性 (使用 MQINQ 呼叫)
- 設定佇列的屬性 (使用 MQSET 呼叫)
如果名為的佇列是模型佇列,則會建立動態本端佇列。 請參閱 MQOPEN-開啟物件中說明的
ObjDesc參數。配送清單是一種特殊類型的佇列物件,包含佇列清單。 它可以開啟以放置訊息,但不能取得或瀏覽訊息,或查詢或設定屬性。 如需進一步詳細資料,請參閱使用注意事項 8。
具有
QSGDISP(GROUP)的佇列是特殊類型的佇列定義,無法與 MQOPEN 或 MQPUT1 呼叫搭配使用。 - 用於查詢清單中佇列名稱的名單 (使用 MQINQ 呼叫)。
- 查詢處理程序屬性 (使用 MQINQ 呼叫) 的處理程序定義。
- 要查詢本端佇列管理程式屬性的佇列管理程式 (使用 MQINQ 呼叫)。
- 發佈訊息的主題 (使用 MQPUT 呼叫)
- 佇列至:
- 應用程式可以多次開啟相同的物件。 每一個開啟都會傳回不同的物件控點。 所傳回的每一個控點都可以用於執行對應開啟的函數。
- 如果要開啟的物件是叢集佇列以外的佇列,則會在 MQOPEN 呼叫時進行本端佇列管理程式內的所有名稱解析。 這包括:
- 將遠端佇列的本端定義名稱解析為遠端佇列管理程式的名稱,以及在遠端佇列管理程式上用來識別佇列的名稱
- 將遠端佇列管理程式名稱解析為本端傳輸佇列的名稱
- (僅限 z/OS ) 將遠端佇列管理程式名稱解析為 IGQ 代理程式所使用的共用傳輸佇列名稱 (僅當本端及遠端佇列管理程式屬於相同的佇列共用群組時才適用)
- 基本佇列或主題物件名稱的別名解析。
不過,請注意,控點的後續 MQINQ 或 MQSET 呼叫只會與已開啟的名稱相關,而不會與發生名稱解析之後所產生的物件相關。 例如,如果開啟的物件是別名,則 MQINQ 呼叫所傳回的屬性是別名的屬性,而不是別名所解析的基本佇列或主題物件的屬性。
如果開啟的物件是叢集佇列,則名稱解析可以在 MQOPEN 呼叫時進行,或延遲到稍後。 發生解析的點是由 MQOPEN 呼叫上指定的 MQOO_BIND_ * 選項所控制:- MQOO_BIND_ON_OPEN
- MQOO_BIND_NOT_FIXED
- MQOO_BIND_AS_Q_DEF
- MQ OO_BIND_ON_GROUP
如需叢集佇列名稱解析的相關資訊,請參閱 名稱解析 。
- 具有 MQOO_BROWSE 選項的 MQOPEN 呼叫會建立瀏覽游標,以與指定物件控點及其中一個瀏覽選項的 MQGET 呼叫搭配使用。 這容許掃描佇列而不變更其內容。 可以使用 MQGMO_MSG_UNDER_CURSOR 選項從佇列中移除透過瀏覽找到的訊息。
透過對相同佇列發出數個 MQOPEN 要求,單一應用程式可以有多個作用中的瀏覽游標。
- 當應用程式啟動時,觸發監視器所啟動的應用程式會傳遞與應用程式相關聯的佇列名稱。 此佇列名稱可以在
ObjDesc參數中指定,以開啟佇列。 如需進一步詳細資料,請參閱 MQTMC2 -觸發訊息 2 (字元格式) 。 - 在 IBM i上,以相容模式執行的應用程式會由應用程式發出的第一個 MQOPEN 呼叫自動連接至佇列管理程式 (如果應用程式尚未使用 MQCONN 呼叫連接至佇列管理程式)。
未在相容模式下執行的應用程式必須先發出 MQCONN 或 MQCONNX 呼叫以明確地連接至佇列管理程式,然後再使用 MQOPEN 呼叫來開啟物件。
先讀選項
- 用戶端和遠端佇列管理程式都必須是 WebSphere MQ 第 7 版或更新版本。
- 用戶端應用程式必須與執行緒 IBM MQ MQI 用戶端程式庫進行編譯及鏈結。
- 用戶端通道必須使用 TCP/IP 通訊協定。
- 該通道必須在用戶端和伺服器通道定義中都具有非零 SharingConversations (SHARECNV) 設定。
下列注意事項適用於使用先讀選項。
- 僅當同時指定 MQOO_BROWSE、MQOO_INPUT_SHARED 及 MQOO_INPUT_EXCLUSIVE 其中一個選項時,才適用先讀選項。 如果使用 MQOO_ INQUIRE 或 MQOO_SET 選項指定先讀選項,則不會擲出錯誤。
- 如果第一個 MQGET 呼叫中使用的選項不支援與先讀搭配使用,則在要求時不會啟用先讀。 此外,當用戶端連接不支援先讀的佇列管理程式時,也會停用先讀。
- 如果應用程式不是以 IBM MQ 用戶端身分執行,則會忽略先讀選項。
叢集佇列數
下列注意事項適用於叢集佇列的使用。
- 第一次開啟叢集佇列時,如果本端佇列管理程式不是完整儲存庫佇列管理程式,則本端佇列管理程式會從完整儲存庫佇列管理程式取得叢集佇列的相關資訊。 當網路忙碌時,本端佇列管理程式可能需要幾秒鐘才能從儲存庫佇列管理程式接收所需的資訊。 因此,發出 MQOPEN 呼叫的應用程式可能必須等待最多 10 秒,然後控制才會從 MQOPEN 呼叫返回。 如果本端佇列管理程式在此時間內未收到叢集佇列的必要相關資訊,則呼叫會失敗,原因碼為 MQRC_CLUSTER_RESOLUTION_ERROR。
- 當開啟叢集佇列且叢集中有多個佇列實例時,開啟的實例取決於 MQOPEN 呼叫上指定的選項:
- 如果指定的選項包括下列任何一項:
- MQ 瀏覽
- MQOO_INPUT_AS_Q_DEF
- MQOO_INPUT_EXCLUSIVE
- MQOO_INPUT_SHARED
- MQOO_SET
- 如果指定的選項未包含先前說明的任何選項,但包含下列其中一項或兩項:
- MQOO_INQUIRE
- MQOO_OUTPUT
- 如果指定的選項包括下列任何一項:
- 如果有佇列的訂閱,但完整儲存庫未確認它,則該物件不會出現在叢集中,且呼叫會失敗,原因碼為 MQRC_OBJECT_NAME。
如需叢集佇列的相關資訊,請參閱 叢集佇列。
分送清單
下列注意事項適用於配送清單的使用。
- 開啟配送清單時, MQOD 結構中的欄位必須設定如下:
Version必須是 MQOD_VERSION_2 或更高版本。ObjectType必須是 MQOT_Q。ObjectName必須是空白或空字串。ObjectQMgrName必須是空白或空字串。RecsPresent必須大於零。ObjectRecOffset和ObjectRecPtr其中一個必須是零,另一個必須是非零。ResponseRecOffset和ResponseRecPtr最多只能有一個是非零。- 必須有
RecsPresent物件記錄,由ObjectRecOffset或ObjectRecPtr定址。 物件記錄必須設為要開啟的目的地佇列名稱。 - 如果其中一個
ResponseRecOffset和ResponseRecPtr不是零,則必須存在RecsPresent回應記錄。 如果呼叫完成,且原因碼為 MQRC_MULTIPLE_REASONS ,則佇列管理程式會設定它們。
透過確保
RecsPresent為零,也可以使用 version-2 MQOD 來開啟不在配送清單中的單一佇列。 Options參數中只有下列開啟選項有效:- MQOO_OUTPUT
- MQOO_PASS_ * _CONTEXT
- MQOO_SET_ * _CONTEXT
- MQOO_ALTERNATE_USER_AUTHORITY
- MQOO_FAIL_IF_QUIESCING
- 配送清單中的目的地佇列可以是本端、別名或遠端佇列,但不能是模型佇列。 如果指定模型佇列,則該佇列無法開啟,原因碼為 MQRC_Q_TYPE_ERROR。 不過,這並不會阻止順利開啟清單中的其他佇列。
- 完成碼和原因碼參數設定如下:
- 如果發佈清單中佇列的開啟作業都以相同方式成功或失敗,則會設定完成碼及原因碼參數來說明一般結果。 在此情況下,不會設定 MQRR 回應記錄 (如果應用程式提供的話)。
例如,如果每個開啟成功,則完成碼會設為 MQCC_OK ,原因碼會設為 MQRC_NONE; 如果每個開啟都失敗,因為沒有佇列存在,則參數會設為 MQCC_FAILED 及 MQRC_UNKNOWN_OBJECT_NAME。
- 如果配送清單中佇列的開啟作業並非全部以相同方式成功或失敗:
- 如果至少一個開啟成功,則完成碼參數會設為 MQCC_WARNING ,如果全部失敗,則會設為 MQCC_FAILED。
- 原因碼參數設為 MQRC_MULTIPLE_REASONS。
- 回應記錄 (如果由應用程式提供) 會設為配送清單中佇列的個別完成碼及原因碼。
- 如果發佈清單中佇列的開啟作業都以相同方式成功或失敗,則會設定完成碼及原因碼參數來說明一般結果。 在此情況下,不會設定 MQRR 回應記錄 (如果應用程式提供的話)。
- 順利開啟配送清單時,呼叫所傳回的控點
Hobj可以在後續的 MQPUT 呼叫中將訊息放入配送清單中的佇列,以及在 MQCLOSE 呼叫中釋放對配送清單的存取權。 配送清單的唯一有效關閉選項是 MQCO_NONE。MQPUT1 呼叫也可以用來將訊息放入配送清單; 定義清單中佇列的 MQOD 結構會指定為該呼叫上的參數。
- 當檢查應用程式是否超出允許的控點數目上限時 (請參閱
MaxHandles佇列管理程式屬性) ,配送清單中每一個順利開啟的目的地都會視為個別控點。 即使配送清單中有兩個以上目的地解析為相同的實體佇列,也會如此。 如果配送清單的 MQOPEN 或 MQPUT1 呼叫會導致應用程式正在使用的控點數目超出MaxHandles,則呼叫會失敗,原因碼為 MQRC_HANDLE_NOT_AVAILABLE。 - 每一個順利開啟的目的地都有其
OpenOutputCount屬性的值加 1。 如果配送清單中有兩個以上目的地解析為相同的實體佇列,則該佇列的OpenOutputCount屬性會隨著配送清單中解析為該佇列的目的地數目而增加。 - 如果個別開啟佇列 (例如,解析路徑中的變更) ,則對佇列定義所做的任何變更會導致控點變成無效,不會導致配送清單控點變成無效。 不過,當在後續 MQPUT 呼叫中使用配送清單控點時,它會導致該特定佇列失敗。
- 配送清單只能包含一個目的地。
遠端佇列
下列注意事項適用於遠端佇列的使用。
在此呼叫的 ObjDesc 參數中,可以使用兩種方式之一來指定遠端佇列。
- 透過為
ObjectName指定遠端佇列的本端定義名稱。 在此情況下,ObjectQMgrName會參照本端佇列管理程式,且可以指定為空白或 (在 C 程式設計語言中) 空字串。本端佇列管理程式所執行的安全驗證會驗證使用者是否已獲授權開啟遠端佇列的本端定義。
- 透過為
ObjectName指定遠端佇列管理程式已知的遠端佇列名稱。 在此情況下,ObjectQMgrName是遠端佇列管理程式的名稱。本端佇列管理程式所執行的安全驗證會驗證使用者是否已獲授權將訊息傳送至名稱解析處理程序所產生的傳輸佇列。
- 本端佇列管理程式不會將任何訊息傳送至遠端佇列管理程式,以檢查使用者是否已獲授權將訊息放置在佇列上。
- 當訊息到達遠端佇列管理程式時,遠端佇列管理程式可能會拒絕它,因為產生訊息的使用者未獲授權。
如需相關資訊,請參閱 MQOD-物件描述子 中說明的 ObjectName 和 ObjectQMgrName 欄位。
物件
安全
下列注意事項與使用 MQOPEN 的安全層面相關。
當發出 MQOPEN 呼叫時,佇列管理程式會執行安全檢查,以驗證執行應用程式的使用者 ID 在允許存取之前具有適當的權限層次。 權限檢查是對正在開啟的物件名稱進行,而不是對名稱進行,在解析名稱之後所產生的名稱。
如果要開啟的物件是指向主題物件的別名佇列,則在執行主題的安全檢查之前,佇列管理程式會對別名佇列名稱執行安全檢查,如同直接使用主題物件一樣。
如果要開啟的物件是主題物件 (單獨使用 ObjectName 或使用 ObjectString (具有或沒有基礎 ObjectName)) ,則佇列管理程式會使用產生的主題字串 (取自 ObjectName中指定的主題物件內) 來執行安全檢查,如果需要將它與 ObjectString中提供的主題物件連結在一起,然後在主題樹狀結構中該點或該點以上尋找最接近的主題物件來執行安全檢查。 這可能不是 ObjectName中指定的相同主題物件。
如果要開啟的物件是模型佇列,則佇列管理程式會對模型佇列的名稱及所建立動態佇列的名稱執行完整安全檢查。 如果隨後明確開啟產生的動態佇列,則會針對動態佇列名稱執行進一步的資源安全檢查。
在 z/OS上,只有在啟用安全時,佇列管理程式才會執行安全檢查。 如需安全檢查的相關資訊,請參閱 在 z/OS 上設定安全 。
屬性
下列附註與屬性相關。
當應用程式開啟物件時,物件的屬性可能會變更。 在許多情況下,應用程式不會注意到這一點,但對於某些屬性,佇列管理程式會將控點標示為不再有效。 這些屬性如下:
- 任何會影響物件名稱解析的屬性。 不論使用的開啟選項為何,這都適用,並包括下列各項:
- 對開啟之別名佇列的
BaseQName屬性所做的變更。 - 對開啟之別名佇列的
TargetType屬性所做的變更。 RemoteQName或RemoteQMgrName佇列屬性的變更,針對此佇列開啟的任何控點,或針對透過此定義解析為佇列管理程式別名的佇列。- 導致遠端佇列目前開啟的控點解析為不同的傳輸佇列,或完全無法解析為傳輸佇列的任何變更。 例如,這可能包括:
- 對遠端佇列之本端定義的
XmitQName屬性所做的變更,不論該定義是用於佇列,還是用於佇列管理程式別名。 - (僅限 z/OS )
IntraGroupqueuing佇列管理程式屬性值的變更,或共用傳輸佇列 (SYSTEM.QSG.TRANSMIT.QUEUE)。
有一個例外: 建立新的傳輸佇列。 如果控點在開啟時已存在,但改為解析為預設傳輸佇列,則該控點不會變成無效。
- 對遠端佇列之本端定義的
DefXmitQName佇列管理程式屬性的變更。 在此情況下,所有解析為先前指名佇列的開啟控點 (僅因為它是預設傳輸佇列而解析為該佇列) 都會標示為無效。 因其他原因而解析至此佇列的控點不受影響。
- 對開啟之別名佇列的
Shareability佇列屬性 (如果目前有兩個以上控點為此佇列或解析為此佇列的佇列提供 MQOO_INPUT_SHARED 存取權)。 如果是這樣,則不論開啟選項為何,針對此佇列或針對解析此佇列的佇列開啟的 所有 控點都會標示為無效。在 z/OS上,如果一或多個控點目前提供佇列的 MQOO_INPUT_SHARED 或 MQOO_INPUT_EXCLUSIVE 存取權,則先前說明的控點會標示為無效。
Usage佇列屬性,適用於針對此佇列開啟的所有控點,或解析為此佇列的佇列,不論開啟選項為何。
如果變更屬性導致發生此情況,請使用特殊強制版本的呼叫。
C 呼叫
MQOPEN (Hconn, &ObjDesc, Options, &Hobj, &CompCode,
&Reason);
MQHCONN Hconn; /* Connection handle */
MQOD ObjDesc; /* Object descriptor */
MQLONG Options; /* Options that control the action of MQOPEN */
MQHOBJ Hobj; /* Object handle */
MQLONG CompCode; /* Completion code */
MQLONG Reason; /* Reason code qualifying CompCode */
COBOL 呼叫
CALL 'MQOPEN' USING HCONN, OBJDESC, OPTIONS, HOBJ, COMPCODE, REASON
** Connection handle
01 HCONN PIC S9(9) BINARY.
** Object descriptor
01 OBJDESC.
COPY CMQODV.
** Options that control the action of MQOPEN
01 OPTIONS PIC S9(9) BINARY.
** Object handle
01 HOBJ PIC S9(9) BINARY.
** Completion code
01 COMPCODE PIC S9(9) BINARY.
** Reason code qualifying COMPCODE
01 REASON PIC S9(9) BINARY.
PL/I 呼叫
call MQOPEN (Hconn, ObjDesc, Options, Hobj, CompCode, Reason);
dcl Hconn fixed bin(31); /* Connection handle */
dcl ObjDesc like MQOD; /* Object descriptor */
dcl Options fixed bin(31); /* Options that control the action of
MQOPEN */
dcl Hobj fixed bin(31); /* Object handle */
dcl CompCode fixed bin(31); /* Completion code */
dcl Reason fixed bin(31); /* Reason code qualifying CompCode */
High Level Assembler 呼叫
CALL MQOPEN,(HCONN,OBJDESC,OPTIONS,HOBJ,COMPCODE,REASON)
HCONN DS F Connection handle
OBJDESC CMQODA , Object descriptor
OPTIONS DS F Options that control the action of MQOPEN
HOBJ DS F Object handle
COMPCODE DS F Completion code
REASON DS F Reason code qualifying COMPCODE
Visual Basic 呼叫
MQOPEN Hconn, ObjDesc, Options, Hobj, CompCode, Reason
Dim Hconn As Long 'Connection handle'
Dim ObjDesc As MQOD 'Object descriptor'
Dim Options As Long 'Options that control the action of MQOPEN'
Dim Hobj As Long 'Object handle'
Dim CompCode As Long 'Completion code'
Dim Reason As Long 'Reason code qualifying CompCode'
![[IBMi]](../common/../com.ibm.mq.ref.dev.doc/ngibmi.gif)