MQSUB-登錄訂閱
使用 MQSUB 呼叫來登錄特定主題的應用程式訂閱。
語法
MQSUB (Hconn、 SubDesc、 Hobj、 Hsub、 Compcode、 Reason)
參數
- Hconn
- 類型 :MQHCONN-輸入
此控點代表佇列管理程式的連線。 前一個 MQCONN 或 MQCONNX 呼叫已傳回
Hconn的值。在 z/OS® for CICS® 應用程式上,以及在 IBM® i for 以相容模式執行的應用程式上,可以省略 MQCONN 呼叫,並針對Hconn指定下列值:- MQHC_DEF_HCONN
- 預設連線控點。
- SubDesc
- 類型 :MQSD-輸入/輸出
此結構可識別應用程式正在登錄的使用中物件。 如需相關資訊,請參閱 MQSD-訂閱描述子 。
- HOBJ
- 類型 :MQHOBJ-輸入/輸出
此控點代表為了取得傳送至此訂閱的訊息而建立的存取權。 這些訊息可以儲存在特定佇列上,或佇列管理程式可以管理其儲存體而不使用特定佇列。
若要使用特定佇列,您必須在建立訂閱時將它與訂閱相關聯。 您可以使用兩種方式來執行此動作:- 透過使用 DEFINE SUB MQSC 指令,並提供該指令與佇列物件名稱。
- 使用 MQSO_CREATE 呼叫 MQSUB 時提供此控點如果提供此控點作為呼叫上的輸入參數,則它必須是從佇列的前一個 MQOPEN 呼叫中使用下列至少一個選項所傳回的有效物件控點:
- MQOO_INPUT_ *
- MQ 瀏覽
- MQOO_OUTPUT (如果佇列是遠端佇列)
如果佇列管理程式要管理傳送至此訂閱的訊息儲存體,則應該在建立訂閱時使用 MQSO_MANAGED 選項來設定此值。 然後,佇列管理程式會傳回此控點作為呼叫的輸出參數。 傳回的控點稱為受管理控點。 如果指定 MQHO_NONE 但未指定 MQSO_MANAGED ,則呼叫會失敗,並產生 MQRC_HOBJ_ERROR。
當佇列管理程式將受管理控點傳回給您時,您可以在具有或不具有瀏覽選項的 MQGET 或 MQCB 呼叫、MQINQ 呼叫或 MQCLOSE 上使用它。 您無法在 MQPUT、MQSUB、MQSET 上使用它; 嘗試這樣做會失敗,並產生 MQRC_NOT_OPEN_FOR_OUTPUT、MQRC_HOBJ_ERROR 或 MQRC_NOT_OPEN_FOR_SET。
如果正在使用 MQSD 結構中的 MQSO_RESUME 選項來回復此訂閱,則可以透過將 MQSO_MANAGED 設為 MQHO_NONE ,將控點傳回此參數中的應用程式。 不論訂閱是否使用受管理控點,您都可以執行此動作,而且提供使用 DEFINE SUB 所建立的訂閱與該指令上所定義的訂閱佇列控點。 在回復以管理方式建立的訂閱的情況下,佇列會以 MQOO_INPUT_AS_Q_DEF 和 MQOO_BROWSE 開啟。 如果您需要指定其他選項,應用程式必須明確開啟訂閱佇列,並在呼叫時提供物件控點。 如果開啟佇列時發生問題,則呼叫會失敗,並產生 MQRC_INVALID_DESTINATION。 如果提供
Hobj,則它必須相當於原始 MQSUB 呼叫中的Hobj。 這表示如果提供從 MQOPEN 呼叫傳回的物件控點,則該控點必須與先前使用的佇列相同。 如果不是相同的佇列,則呼叫會失敗,並產生 MQRC_HOBJ_ERROR。如果使用 MQSD 結構中的 MQSO_ALTER 選項來變更此訂閱,則可以提供不同的
Hobj。 任何已遞送至佇列且先前透過此參數所識別的發佈都會留在該佇列上,而且如果Hobj參數現在代表不同的佇列,則應用程式會負責擷取那些訊息。下表彙總此參數與各種訂閱選項的使用:選項 Hobj說明 MQSO_CREATE + MQSO_MANAGED 輸入時忽略 建立訂閱並儲存佇列管理程式所管理的訊息 MQSO_CREATE 有效的物件控點 建立訂閱,以提供特定佇列作為訊息的目的地。 MQ 回復 MQHO_NONE 回復先前建立的訂閱 (不論它是否受管理) ,並讓佇列管理程式傳回物件控點供應用程式使用。 MQ 回復 有效、相符、物件控點 回復先前建立的訂閱,使用特定佇列作為訊息的目的地,並使用具有特定開啟選項的物件控點。 MQSO_ALTER + MQSO_MANAGED MQHO_NONE 變更先前使用特定佇列的現有訂閱,因此它現在是受管理訂閱。 無法變更目的地 (受管理或未受管理) 的類別。 MQSO_ALTER 有效的物件控點 變更現有訂閱 (不論是否受管理) ,以便它現在使用特定佇列。 未使用 MQSO_MANAGED 選項時,可以變更提供的佇列,但無法變更目的地的類別 (受管理或未受管理)。 不論是否已提供或傳回,都必須在後續的 MQGET 或 MQCB 呼叫上指定
Hobj,以接收傳送至此訂閱的發佈訊息。當對
Hobj控點發出 MQCLOSE 呼叫時,或當定義控點範圍的處理單元終止時 (直到應用程式中斷連線為止) ,該控點不再有效。 傳回的物件控點範圍與呼叫上指定的連線控點範圍相同。 如需控點範圍的相關資訊,請參閱 Hconn (MQHCONN)-output 。Hobj控點的 MQCLOSE 不會影響Hsub控點。 - HSub
- 類型 :MQHOBJ-輸出此控點代表已建立的訂閱。 它可以用於兩個進一步的作業:
- 它可以在後續的 MQSUBRQ 呼叫上使用,以要求在建立訂閱時使用 MQSO_PUBLICATIONS_ON_REQUEST 選項時傳送發佈。
- 它可以在後續的 MQCLOSE 呼叫中使用,以移除已建立的訂閱。 當發出 MQCLOSE 呼叫時,或當定義控點範圍的處理單元終止時,
Hsub控點即不再有效。 傳回的物件控點範圍與呼叫上指定的連線控點範圍相同。Hsub控點的 MQCLOSE 不會影響Hobj控點。
此控點無法傳遞至 MQGET 或 MQCB 呼叫。 您必須使用
Hobj參數。 您無法在 MQCLOSE 或 MQSUBRQ 以外的任何 IBM MQ 呼叫上使用此控點。 將此控點傳遞至任何其他 IBM MQ 呼叫會導致 MQRC_HOBJ_ERROR。 - CompCode
- 類型 :MQLONG-輸出完成碼; 它是下列其中一項:
- MQCC_OK
- 順利完成
- MQCC_WARNING
- 警告 (局部完成)
- MQCC_FAILED
- 通話失敗
- 原因
- 類型 :MQLONG-輸出
定義
CompCode的原因碼。如果CompCode是 MQCC_OK ,則原因碼如下:- MQRC_NONE
- (0 , X'000 ') 沒有理由報告。
如果CompCode是 MQCC_FAILED ,則原因碼為下列其中一項:- MQRC_CLUSTER_RESOLUTION_ERROR
- (2189 , X'88D') 叢集名稱解析失敗。
- MQRC_DURABILITY_NOT_ALLOWED
- 2436 (X'0984 ') 使用 MQSO_DURABLE 選項的 MQSUB 呼叫失敗。
- MQRC_FUNCTION_NOT_SUPPORTED
- 2298 (X'08FA') 在現行環境中無法使用所要求的功能。
- MQRC_HOBJ_ERROR
- 2019 (X'07E3') 物件控點 Hobj 無效。
- MQRC_IDENTITY_MISMATCH
- 2434 (X'0982 ') 訂閱名稱符合現有訂閱。
- MQRC_NOT_AUTHORIZED
- 2035 (X'07F3') 使用者未獲授權執行作業。
- MQRC_NO_SUBSCRIPTION
- 2428 (X'097C') 所識別的訂閱名稱不存在。
- MQRC_OBJECT_STRING_ERROR
- 2441 (X'0989 ') Objectstring 欄位無效。
- MQRC_OPTIONS_ERROR
- 2046 (X'07FE') 選項參數或欄位包含無效的選項或無效的選項組合。
- MQRC_Q_MGR_QUIESCING
- 2161 (X'0871 ') 佇列管理程式靜止中。
- MQRC_RECONNECT_Q_MGR_REQD
- 2555 (X'09FB' X) 需要 MQCNO_RECONNECT_Q_MGR 選項。
- MQRC_RETAINED_MSG_Q_ERROR
- 2525 (X'09DD') 無法擷取已訂閱主題字串的已保留發佈資訊。
- MQRC_RETAINED_NOT_DELIVERED
- 2526 (X'09DE') 已訂閱主題字串的保留發佈資訊無法遞送至訂閱目的地佇列,也無法遞送至無法傳送郵件的佇列。
- MQRC_SD_ERROR
- 2424 (X'0978 ') 訂閱描述子 (MQSD) 無效。
- MQRC_SELECTION_NOT_AVAILABLE
- 2551 (X'09F7') 選取字串未遵循 IBM MQ 選取器語法,且沒有可用的延伸訊息選取提供者。
- MQRC_SELECTION_STRING_ERROR
- 2519 (X'09D7') 必須依照 MQCHARV 結構文件的說明來指定選取字串。
- MQRC_SELECTOR_SYNTAX_ERROR
- 2459 (X'099B') 已發出 MQOPEN、 MQPUT1或 MQSUB 呼叫,但指定了包含語法錯誤的選取字串。
- MQRC_SUB_USER_DATA_ERROR
- 2431 (X'097F') SubUser資料欄位無效。
- MQRC_SUB_NAME_ERROR
- 2440 (X'0988 ') SubName 欄位無效。
- MQRC_SUB_ALREADY_EXISTS
- 2432 (X'0980 ') 訂閱已存在。
- MQRC_SUB_USER_DATA_ERROR
- 2431 (X'097F') SubUser資料欄位無效。
- MQRC_TOPIC_STRING_ERROR
- 2425 (X'0979 ') 主題字串無效。
- MQRC_UNKNOWN_OBJECT_NAME
- 2085 (X'0825 ') 找不到 MQSD ObjectName 欄位中所識別的物件。
如需這些代碼的詳細資訊,請參閱 訊息及原因碼。
使用注意事項
- 訂閱是對主題進行,使用預先定義主題物件的簡稱、主題字串的完整名稱來命名,或由兩個部分連結而成。 請參閱 MQSD-訂閱描述子中
ObjectName及ObjectString的說明。 - 當發出 MQSUB 呼叫時,佇列管理程式會執行安全檢查,以驗證執行應用程式的使用者 ID 在允許存取之前具有適當的權限層次。 適當的主題物件位於主題階層中,且會對此主題物件進行權限檢查,以確保已設定訂閱權限。 如果未使用 MQSO_MANAGED 選項,則會對目的地佇列進行權限檢查,以確保設定輸出的權限。 如果使用 MQSO_MANAGED 選項,則不會對受管理佇列進行輸出或查詢存取權的權限檢查。
- 如果您未提供 Hobj 作為輸入, MQSUB 呼叫會配置兩個控點: 物件控點 (Hobj) 和訂閱控點 (Hsub)。
- 當使用 MQSO_MANAGED 選項時,會在 MQSUB 呼叫中傳回 Hobj ,可以進行查詢,以找出諸如「取消」臨界值及「過多取消重新排入佇列」名稱之類的屬性。 您也可以查詢受管理佇列的名稱,但不得嘗試直接開啟此佇列。
- 訂閱可以分組,即使多個群組符合發佈,也只容許將單一發佈遞送至訂閱群組。 訂閱會使用 MQSO_GROUP_SUB 選項進行分組,為了將訂閱分組,它們必須是
- 在相同的佇列管理程式上使用相同的具名佇列 (不使用 MQSO_MANAGED 選項)-由 MQSUB 呼叫上的 Hobj 參數代表
- 共用相同的 SubCorrelID
- 屬於相同的 SubLevel
- 順利完成 MQSUB 呼叫並不表示動作已完成。 若要檢查此呼叫是否已完成,請參閱 檢查分散式網路的非同步指令是否已完成中的 DEFINE SUB 步驟。
- 從使用 MQSO_RESUME 選項的 MQSUB 呼叫傳回時,會填寫 MQSD 中的欄位。 傳回的 MQSD 可以直接傳遞至 MQSUB 呼叫,該呼叫會使用 MQSO_ALTER 選項,且您需要對套用至 MQSD 的訂閱進行任何變更。 如表格中所述,部分欄位有特殊考量。MQSUB 的 MQSD 輸出
MQSD 中的欄位名稱 特殊考量 存取或建立選項 從 MQSUB 呼叫返回時可以重設部分選項。 如果您隨後在 MQSUB 呼叫中重複使用 MQSD ,則必須明確設定您需要的選項。 延續性選項、目的地選項、登錄選項及萬用字元選項 視需要設定這些選項 發佈選項 這些選項會適當地設定,但 MQSO_NEW_PUBLICATIONS_ONLY 除外,它只適用於 MQSO_CREATE。 其他選項 從 MQSUB 呼叫傳回時,這些選項保持不變。 它們控制如何發出 API 呼叫,且不會與訂閱一起儲存。 必須在重複使用 MQSD 的任何後續 MQSUB 呼叫上視需要設定它們。 ObjectName 從 MQSUB 呼叫傳回時,此僅輸入欄位保持不變。 ObjectString 從 MQSUB 呼叫傳回時,此僅輸入欄位保持不變。 如果提供緩衝區,則會在 ResObjectString欄位中傳回使用的完整主題名稱。AlternateUserId 和 AlternateSecurityId 從 MQSUB 呼叫傳回時,這些僅輸入欄位保持不變。 它們控制如何發出 API 呼叫,且不會與訂閱一起儲存。 它們必須在重複使用 MQSD 的任何後續 MQSUB 呼叫上視需要設定。 SubExpiry 使用 MQSO_RESUME 選項從 MQSUB 呼叫返回時,此欄位會設為訂閱的原始到期,而不是剩餘到期時間。 然後,如果您使用 MQSO_ALTER 選項在 MQSUB 呼叫中重複使用 MQSD ,則會重設訂閱的期限,以重新開始倒數。 SubName 此欄位是 MQSUB 呼叫的輸入欄位,在輸出時不會變更。 SubUserData and SelectionString 如果提供緩衝區,則在 MQSUB 呼叫使用 MQSO_RESUME 選項輸出時,會傳回這些可變長度欄位,同時在
VSBufSize中也會傳回正的緩衝區長度。 如果未提供任何緩衝區,則只會在 MQCHARV 的VSLength欄位中傳回長度。 如果提供的緩衝區小於傳回欄位所需的空間,則只會在提供的緩衝區中傳回VSBufSize個位元組。然後,如果您使用 MQSO_ALTER 選項在 MQSUB 呼叫中重複使用 MQSD ,且未提供緩衝區,但提供非零
VSLength,如果該長度符合欄位的現有長度,則不會對欄位進行任何變更。SubCorrelID 和 PubAccounting記號 如果您不使用 MQSO_SET_CORREL_ID ,則佇列管理程式會產生
SubCorrelId。 如果您不使用 MQSO_SET_IDENTITY_CONTEXT ,則佇列管理程式會產生PubAccountingToken。使用 MQSO_RESUME 選項,在 MQSD 中從 MQSUB 呼叫傳回這些欄位。 如果由佇列管理程式產生,則會使用 MQSO_CREATE 或 MQSO_ALTER 選項,在 MQSUB 呼叫上傳回產生的值。
PubPriority, SubLevel & PubApplIdentityData 這些欄位會在 MQSD 中傳回。 ResObject字串 如果提供緩衝區,則 MQSD 中只會傳回此輸出欄位。
C 呼叫
MQSUB (Hconn, &SubDesc, &Hobj, &Hsub, &CompCode, &Reason)
MQHCONN Hconn; /* Connection handle */
MQSD SubDesc; /* Subscription descriptor */
MQHOBJ Hobj; /* Object handle */
MQHOBJ Hsub; /* Subscription handle */
MQLONG CompCode; /* Completion code */
MQLONG Reason; /* Reason code qualifying CompCode */
COBOL 呼叫
CALL 'MQSUB' USING HCONN, SUBDESC, HOBJ, HSUB, COMPCODE, REASON.
** Connection handle
01 HCONN PIC S9(9) BINARY.
** Subscription descriptor
01 SUBDESC.
COPY CMQSDV.
** Object handle
01 HOBJ PIC S9(9) BINARY.
** Subscription handle
01 HSUB 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 MQSUB (Hconn, SubDesc, Hobj, Hsub, CompCode, Reason)
dcl Hconn fixed bin(31); /* Connection handle */
dcl SubDesc like MQSD; /* Subscription descriptor */
dcl Hobj fixed bin(31); /* Object handle */
dcl Hsub fixed bin(31); /* Subscription handle */
dcl CompCode fixed bin(31); /* Completion code */
dcl Reason fixed bin(31); /* Reason code qualifying CompCode */
High Level Assembler 呼叫
CALL MQSUB,(HCONN,SUBDESC,HOBJ,HSUB,COMPCODE,REASON)
HCONN DS F Connection handle
SUBDESC CMQSDA , Subscription descriptor
HOBJ DS F Object handle
HSUB DS F Subscription handle
COMPCODE DS F Completion code
REASON DS F Reason code qualifying COMPCODE
![[IBMi]](../common/../com.ibm.mq.ref.dev.doc/ngibmi.gif)