發生問題時,檢查所安裝 Message QueueTM 軟體的版本編號,通常很有幫助。版本編號可讓您確定所用文件的編號是否與軟體版本相符。向 Sun 報告問題時,也需要版本編號。若要檢查版本編號,請發出以下指令:
imqcmd -v
徵兆:
用戶端無法建立新的連線。
用戶端無法自動重新連線失敗的連線。
可能原因:
可能原因:用戶端應用程式未關閉連線,導致連線數目超過資源限制。
若要確認此問題的原因:列出代理程式的所有連線:
imqcmd list cxn
輸出會列出所有連線和建立每個連線的主機,從而瞭解哪些用戶端開啟了過多的連線。
若要解決此問題:重新寫入違例用戶端,以關閉不使用的連線。
可能原因:未執行代理程式或網路連結發生問題。
若要確認此問題的原因:
使用 Telnet 連線至代理程式主要連接埠 (例如,預設的 7676 連接埠),並透過連接埠對映器的輸出來驗證代理程式是否作出回應。
驗證代理程式程序是否在主機上執行。
若要解決此問題:
啟動代理程式。
修復網路連結問題。
可能原因:連線服務不在使用中或已暫停。
若要確認此問題的原因:檢查所有連線服務的狀態:
imqcmd list svc
如果連線服務狀態顯示為 unknown 或 paused,則用戶端無法使用該服務建立連線。
若要解決此問題:
如果連線服務狀態顯示為 unknown,此服務不會顯示在使用中服務的清單 (imq.service.active) 上。在 SSL 型服務中,服務也可能會配置錯誤,造成代理程式在代理程式記錄中產生以下項目:
ERROR [B3009]: Unable to start service ssljms: [B4001]: Unable to open protocol tls for ssljms service...
此項目後面是發生異常的基本原因說明。
若要正確配置 SSL 服務,請參閱訊息加密。
如果連線服務狀態顯示為 paused,請重新繼續該服務 (請參閱暫停和重新繼續連線服務)。
可能原因:可用於所需連線數目的可用執行緒太少。
若要確認此問題的原因:檢查代理程式記錄中的以下項目:
WARNING [B3004]: No threads are available to process a new connection on service ... Closing the new connection.
並且使用下列其中一種格式,檢查連線服務上的連線數目,以及目前使用中的執行緒數目:
imqcmd query svc -n serviceName imqcmd metrics svc -n serviceName -m cxn
每個連線均需要 2 個執行緒:一個用於內送訊息,另一個用於外寄訊息 (請參閱執行緒池管理)。
若要解決此問題:
如果您使用專用執行緒池模型 (imq. serviceName.threadpool_model= dedicated),那麼最大的連線數目是執行緒池中最大執行緒數目的一半。因此,若要增加連線數目,請增加執行緒池的容量 (imq. serviceName.max_threads),或改為使用共用執行緒池模型。
如果您使用共用執行緒池模型 (imq. serviceName.threadpool_model=shared),那麼最大的連線數目是連線監視限制 (imq.serviceName.connectionMonitor_limit ) 與最大執行緒數目 (imq. serviceName.max_threads) 積的一半。因此,若要增加連線數目,請增加執行緒池的大小或增加連線監視限制。
可支援的連線數目 (或連線上的流量) 最終會達到輸入/輸出限制。在此情況下,請使用多代理程式叢集,以分發叢集中代理程式實例上的連線。
可能原因:Solaris 或 Linux 平台上要求用於連線數目的檔案描述元太少。
如需有關此問題的更多資訊,請參閱設定檔案描述元限制。
若要確認此問題的原因:檢查代理程式記錄中是否有以下相似項目:
Too many open files
若要解決此問題:增加檔案描述元限制,如 ulimit 線上手冊所述。
可能原因:TCP 積存區會限制可同時新建連線請求的數目。
TCP 積存區會限制同時儲存在系統積存區內的連線請求數目 (imq.portmapper.backlog ),連接埠對映器會在超過此限制之後拒絕其他請求。(Windows 平台上有程序內定的積存區限制:Windows 個人版作業系統的數目限制為 5 個,Windows 伺服器版作業系統的數目為 200 個。)
因為不會經常出現同時有大量的連線請求,所以因儲存區限制的請求拒絕通常為短暫現象。
若要確認此問題的原因:檢查代理程式記錄。首先,檢查代理程式在拒絕其他連線的同時是否有接受某些連線。接著,檢查拒絕連線的說明訊息。如果找到這類訊息,可能不是 TCP 積存區的問題,因為代理程式不會記錄 TCP 積存區造成的拒絕連線。如果記錄中有成功的連線,但是未記錄任何拒絕連線,則可能是 TCP 積存區的問題。
若要解決此問題:
將用戶端設定成每隔一小段時間就重試連線 (此方法通常可行,因為這是暫時性的問題)。
增加 imq.portmapper.backlog 的值。
檢查用戶端關閉和開啟連線的次數是否過於頻繁。
可能原因:作業系統限制同步運作中連線的數目。
Windows 作業系統授權會限制所支援的同步運作遠端連線的數目。
若要確認此問題的原因:檢查可用於連線的執行緒數目是否夠用 (使用 imqcmd query svc),並檢查 Windows 授權合約的條款。如果您是從本地用戶端建立連線,而不是從遠端用戶端,作業系統限制可能是造成此問題的原因。
若要解決此問題:
升級 Windows 授權,以允許更多的連線。
設定多代理程式叢集,以分發一些代理程式實例的連線。
可能原因:使用者的認證或授權失敗。
認證可能因為下列任一原因而失敗:
密碼不正確
使用者儲存庫中沒有使用者的項目
使用者沒有存取連線服務的權限
若要確認此問題的原因:檢查代理程式記錄中是否有 Forbidden 錯誤訊息的項目。這表示有驗證錯誤,但不表示為問題發生的原因。
如果您使用檔案式使用者儲存庫,請輸入以下指令:
imqusermgr list -i instanceName -u userName
如果輸出顯示有使用者,則可能是提交了錯誤的密碼。如果輸出顯示下列錯誤,則使用者儲存庫中沒有該使用者的任何項目:
Error [B3048]: User does not exist in the password file
如果您使用 LDAP 伺服器使用者儲存庫,請使用適當的工具檢查是否有使用者的任何項目。
檢查存取控制特性檔案,查看是否有存取連線服務的限制。
若要解決此問題:
如果使用的密碼錯誤,請提供正確的密碼。
如果使用者儲存庫中沒有使用者的任何項目,請增加一個項目 (請參閱寫入和管理使用者儲存庫)。
如果使用者沒有存取連線服務的權限,請編輯存取控制特性檔案以授予這類權限 (請參閱連線服務的存取控制)。
徵兆:
訊息流量未符合預期速度。
支援連線至代理程式的數目並未如用戶端無法建立連線中所述受到限制,而是因為訊息輸入/輸出速率受到限制。
可能原因:
可能原因:網路連線或 WAN 太慢。
若要確認此問題的原因:
Ping 網路以查看 Ping 指令傳回所需的時間,並洽詢網路管理員。
使用本地用戶端傳送和接受訊息,並且與遠端用戶端 (使用網路連結) 比較傳送時間。
若要解決此問題:升級網路連結。
可能原因:連線服務協定的速度原本就比 TCP 的速度慢。
例如,SSL 型或 HTTP 型協定的速度會比 TCP 的速度慢 (請參閱傳輸協定)。
若要確認此問題的原因:如果您使用 SSL 型或 HTTP 型協定,請嘗試使用 TCP 並比較傳送時間。
若要解決此問題:通常,應用程式需求決定要使用的協定,所以除了如調校傳輸協定中所述嘗試調校協定效能外,沒有更多的辦法。
可能原因:連線服務協定未調校為最佳效能。
若要確認此問題的原因:嘗試調校協定,並查看是否有任何差異。
若要解決此問題:嘗試調校協定,如調校傳輸協定中所述。
可能原因:訊息過大導致使用過多的頻寬。
若要確認此問題的原因:嘗試以較小訊息執行效能評定。
若要解決此問題:
請應用程式開發者修改應用程式以使用訊息壓縮功能,如「Message Queue Developer's Guide for Java Clients」中所述。
將訊息用作要傳送的資料通知,但使用其他協定移動資料。
可能原因:實際上,連線流量過慢的問題,是訊息傳送程序的某些步驟中會遇到的瓶頸。
若要確認此問題的原因:如果上述原因都不是造成連線流量速度過慢的原因,則請參閱影響效能的因素,找出其他可能的瓶頸,並檢查是否有任何與以下問題相關的徵兆:
若要解決此問題:依照上述疑難排解各節提供的問題解決方案進行排解。
徵兆:
無法建立用於實體目標的訊息產生器;用戶端接收到異常。
可能原因:
可能原因:已將實體目標配置為僅允許有限數目的產生器。
為了防止在實體目標上累積訊息,方法之一就是限制實體目標可支援的產生器數目 (maxNumProducers)。
若要確認此問題的原因:檢查實體目標:
imqcmd query dst
(請參閱顯示實體目標資訊)。輸出會顯示目前的產生器數目和 maxNumProducers 的值。如果兩個值相同,表示產生器數目到達配置的限制。代理程式拒絕新的產生器時,該代理程式會傳回異常
ResourceAllocationException [C4088]: A JMS destination limit was reached
並且在代理程式記錄中產生以下項目:
[B4183]: Producer can not be added to destination
若要解決此問題:增加 maxNumProducers 屬性的值 (請參閱更新實體目標特性)。
可能原因:存取控制特性檔案中的設定未授權使用者建立訊息產生器。
若要確認此問題的原因:代理程式拒絕新的產生器時,代理程式會傳回異常
JMSSecurityException [C4076]: Client does not have permission to create producer on destination
並且在代理程式記錄中產生以下項目:
[B2041]: Producer on destination denied[B4051]: Forbidden guest.
若要解決此問題:變更存取控制特性,以允許使用者產生訊息 (請參閱實體目標的存取控制)。
徵兆:
傳送永久性訊息時,send方法不會傳回,而且用戶端會阻斷。
傳送永久性訊息時,用戶端接收到異常。
訊息產生用戶端的速度變慢。
可能原因:
可能原因:訊息積存於代理程式上,因此回應訊息產生器的速度會變慢。
積存的代理程式會將訊息累積在代理程式記憶體中。實體目標記憶體中的訊息數目或訊息容量到達所配置的限制時,代理程式會依指定的限制運作方式,嘗試節省記憶體資源。以下限制運作方式會降低訊息產生器的速度:
FLOW_CONTROL:代理程式不會立即確認已收到永久性訊息 (因此會阻斷訊息產生用戶端)。
REJECT_NEWEST:代理程式拒絕新的永久性訊息。
同樣地,整個代理程式記憶體 (用於所有實體目標) 中的訊息數目或訊息容量到達所配置的限制時,代理程式會拒絕最新的訊息,以嘗試節省記憶體資源。再者,到達系統記憶體限制時,因為實體目標或整個代理程式的限制未正確設定,所以代理程式會採取愈來愈重要的動作,以防記憶體超載。這些動作包括減低訊息產生器的速度。
若要確認此問題的原因:當代理程式按照所配置的訊息限制來拒絕訊息時,代理程式會傳回異常
JMSException [C4036]: A server error occurred
並且在代理程式記錄中產生以下項目:
[B2011]: Storing of JMS message from IMQconn failed
此訊息後面還有一則訊息指出已經達到限制:
[B4120]: Cannot store message on destination destName because capacity of maxNumMsgs would be exceeded.
這是超出實體目標訊息限制時的狀況;或者
[B4024]: The maximum number of messages currrently in the system has been exceeded, rejecting message.
這是超出整個代理程式訊息限制時的狀況。
一般而言,您可以在遭到拒絕前,依以下方式檢查訊息限制條件:
查詢實體目標和代理程式,以檢查兩者所配置的訊息限制設定。
使用適當的 imqcmd 指令,監視目前實體目標上或整個代理程式範圍內的訊息數目或訊息容量。如需可監視的度量和取得度量之指令的詳細資訊,請參閱第 18 章, 度量參照。
若要解決此問題:
請小心修改實體目標 (或整個代理程式) 的訊息限制,不要超過記憶體資源。
一般來說,您應該在個別目標層級上管理記憶體,如此便可確保不會達到整個代理程式的訊息限制。如需更多資訊,請參閱代理程式調校。
變更目標上的限制運作方式,使其在到達訊息限制時不會降低訊息產生速度,而是丟棄記憶體中的訊息。
例如,您可以指定 REMOVE_OLDEST 和 REMOVE_LOW_PRIORITY 限制運作方式,以刪除記憶體中累積的訊息 (請參閱表 15–1)。
可能原因:代理程式無法將永久性訊息儲存到資料存放區。
如果代理程式無法存取資料存放區或將永久性訊息寫入資料存放區,則表示訊息產生用戶端被阻斷。這種情況亦會在目標或整個代理程式訊息到達限制時發生,如上所述。
若要確認此問題的原因:如果代理程式無法寫入資料存放區,則會在代理程式記錄中產生以下其中一個項目:
[B2011]: Storing of JMS message from connectionID failed [B4004]: Failed to persist message messageID
若要解決此問題:
若使用檔案式永久性,請嘗試增加檔案式資料存放區的磁碟空間。
若使用 JDBC 相容資料存放區,請檢查是否已正確配置 JDBC 型永久性 (請參閱配置永久性資料存放區)。如果已正確配置,請洽詢您的資料庫管理者以排解其他資料庫問題。
可能原因:代理程式回應逾時過短。
由於連線速度慢或代理程式緩慢 (由於高 CPU 使用率或記憶體資源不足所引起),代理程式可能需要更多時間確認永久性訊息的接收,所需要的時間會超過連線工廠 imqAckTimeout 屬性所允許的值。
若要確認此問題的原因:如果超過 imqAckTimeout 值,代理程式會傳回異常
JMSException [C4000]: Packet acknowledge failed
若要解決此問題:變更 imqAckTimeout 連線工廠屬性的值 (請參閱可靠性與流量控制)。
可能原因:訊息產生用戶端受到 JVM 限制。
若要確認此問題的原因:
檢查用戶端應用程式是否接收到記憶體不足的錯誤。
使用執行階段方法檢查 JVM 堆疊中的可用記憶體,例如:freeMemory、maxMemory和totalMemory。
若要解決此問題:調整 JVM (請參閱Java 虛擬機器調整)。
徵兆:
訊息產生延遲或代理程式拒絕產生的訊息。
訊息需要超長的時間才能到達用戶。
代理程式 (或特定目標) 中的訊息數目或訊息容量隨著時間穩定增加。
若要查看是否累積訊息,請檢查代理程式中的訊息數目或訊息容量如何不斷變化,並與配置的限制進行比較。請先檢查配置的限制:
imqcmd query bkr
imqcmd metrics bkr 子指令不會顯示此資訊。
接著檢查每個目標中的訊息累積:
imqcmd list dst
若要查看訊息是否超過所配置的目標或整個代理程式的限制,請檢查代理程式記錄中是否有以下項目:
[B2011]: Storing of JMS message from … failed.
此項目後面還有其他項目,說明已超過限制。
可能原因:
可能原因:主題目標上有非使用中的長期訂閱。
如果長期訂閱為非使用中,則訊息會儲存在目標中,直到對應的用戶變為使用中狀態並能使用這些訊息為止。
若要確認此問題的原因:檢查每個主題目標上的長期訂閱狀態:
imqcmd list dur -d destName
若要解決此問題:
清除違例長期訂閱的所有訊息 (請參閱管理長期訂閱)。
指定用於主題的訊息限制和限制運作方式屬性 (請參閱表 15–1)。例如,您可以指定 REMOVE_OLDEST 和 REMOVE_LOW_PRIORITY 限制運作方式,以刪除記憶體中累積的訊息。
從對應的目標清除所有訊息 (請參閱清除實體目標)。
重新寫入訊息產生用戶端以設定每個訊息的存在時間值,來限制訊息可保留在記憶體中的時間。您可以置換共用一條連線之所有產生器的任何此類設定值,方法為設定 imqOverrideJMSExpiration 和 imqJMSExpiration 連線工廠屬性 (請參閱 訊息標頭置換)。
可能原因:佇列中可使用訊息的用戶太少。
如果可接收所傳送訊息的使用中用戶太少,則訊息累積時可能會積存在佇列目標中。此情況會因以下任何一種原因而發生:
目標中存在的使用中用戶太少。
訊息使用用戶端建立連線失敗。
沒有使用中用戶使用符合佇列中訊息的選擇器。
若要確認此問題的原因:請檢查目標上使用中用戶的數目,以便幫助您判斷用戶為何無法使用:
imqcmd metrics dst - n destName -t q -m con
若要解決此問題:根據無法使用用戶的原因:
啟動其他訊息使用用戶端,為佇列建立更多使用中用戶。
調整 imq.consumerFlowLimit 代理程式特性,使得佇列傳送訊息至多個用戶的效能最佳化 (請參閱多重用戶佇列效能)。
指定用於佇列的訊息限制和限制運作方式屬性 (請參閱表 15–1)。例如,您可以指定 REMOVE_OLDEST 和 REMOVE_LOW_PRIOROTY 限制運作方式,以刪除記憶體中累積的訊息。
從對應的目標清除所有訊息 (請參閱清除實體目標)。
重新寫入訊息產生用戶端以設定各個訊息的存在時間值,來限制訊息可保留在記憶體中的時間。您可以置換用於共用連線之所有產生器的任何此類設定值,方法為設定 imqOverrideJMSExpiration 和 imqJMSExpiration 連線工廠屬性 (請參閱 訊息標頭置換)。
可能原因:訊息用戶處理速度過慢,無法跟上訊息產生器的速度。
在此狀況下,主題訂閱者或佇列接收者使用訊息的速度,會比產生器傳送訊息的速度慢。因為此不平衡現象,所以一個或多個目標中會出現訊息積存。
若要確認此問題的原因:檢查傳入和傳出代理程式之訊息流量的速率:
imqcmd metrics bkr -m rts
然後檢查每個個別目標的流量速率:
imqcmd metrics bkr -t destType -n destName - m rts
若要解決此問題:
最佳化訊息使用用戶端程式碼。
增加用於佇列目標的使用中用戶數目 (請參閱多重用戶佇列效能)。
可能原因:用戶端確認處理會降低訊息使用速度。
有兩個因素會影響用戶端確認處理:
處理用戶端確認時會大量使用代理程式資源。因此,使用這些確認模式可能會降低訊息使用的速度,因為訊息使用用戶端會阻斷,直到代理程式確定用戶端確認為止。
JMS 有效負載訊息和 Message Queue 控制訊息 (例如用戶端確認) 共用同一個連線。因此,JMS 有效負載訊息可能會阻擋控制訊息,因而降低訊息使用的速度。
若要確認此問題的原因:
檢查與封包流量相關的訊息流量。如果每秒的封包數目與訊息數目不成比例,則用戶端確認可能有問題。
檢查用戶端是否接收到下列異常:
JMSException [C4000]: Packet acknowledge failed
若要解決此問題:
修改用戶端所使用的確認模式:例如,改為使用 DUPS_OK_ACKNOWLEDGE 或 CLIENT_ACKNOWLEDGE。
如果使用 CLIENT_ACKNOWLEDGE 或已處理的階段作業,請將更大數目的訊息集合成單一確認的群組。
調整用戶和連線流量控制參數 (請參閱用戶端執行階段訊息流量調校 )。
可能原因:代理程式無法跟上產生訊息的速度。
在此狀況下,訊息傳入代理程式的速度,會比代理程式路由和派送訊息到用戶的速度快。代理程式運作遲緩可以是因為以下任何或所有限制造成:
CPU
網路通訊端讀取/寫入作業
磁碟讀取/寫入作業
記憶體分頁
永久性存放區
JVM 記憶體限制
若要確認此問題的原因:檢查是否有其他可能造成此問題的原因。
若要解決此問題:
升級您電腦或資料存放區的速度。
使用代理程式叢集,分發一些代理程式實例上的負載。
可能原因:用戶端程式碼缺點;用戶不確認訊息。
在所有要接收所傳送之訊息的用戶確認訊息之前,這些訊息會被保留在目標中。如果用戶端不確認使用的訊息,那麼訊息會累積在目標中且不被刪除。
舉例來說,用戶端程式碼可能會有以下缺點:
使用 CLIENT_ACKNOWLEDGE 確認模式或已處理的階段作業的用戶,可能不會定期呼叫Session.acknowledge或Session.commit。
使用 AUTO_ACKNOWLEDGE 確認模式的用戶可能因某些原因而當機。
若要確認此問題的原因:首先,檢查本節中列出的所有其他可能原因。然後,使用下列指令,列出目標:
imqcmd list dst
請注意 UnAcked 標頭下列出的訊息數目,是否與目標中的訊息數目相同。此標頭下的訊息已傳送到用戶,但是尚未經過確認。如果這個數目與訊息總數相同,表示代理程式已經送出所有訊息,正在等待確認。
若要解決此問題:請應用程式開發者協助除錯此問題。
徵兆:
訊息流量偶爾會降低,接著又恢復正常效能。
可能原因:
可能原因:代理程式的記憶體資源非常少。
因為未正確設定目標與代理程式限制,代理程式會採取越來越嚴格的動作,以防記憶體超載,這會導致在清除積存的訊息前,代理程式運作緩慢。
若要確認此問題的原因:檢查記憶體不足狀況下的代理程式記錄
[B1089]: In low memory condition, broker is attempting to free up resources
後面還有一個項目,描述新的記憶體狀態和所使用的記憶體總數。也請檢查 JVM 堆疊中可用的記憶體:
imqcmd metrics bkr -m cxn
JVM 記憶體總數接近 JVM 記憶體最大值時,可用記憶體會不足。
若要解決此問題:
調整 JVM (請參閱Java 虛擬機器調整)。
增加系統交換空間。
可能原因:正在執行 JVM 記憶體收回 (廢棄項目收集)。
記憶體收回程序會定期檢查整個系統,以釋放記憶體。發生此情況時,會阻斷所有執行緒。釋放出來的記憶體數量越多,JVM 堆疊的容量越大,因記憶體收回而導致的延遲時間就越長。
若要確認此問題的原因:監視電腦的 CPU 使用率。執行記憶體收回時,會大幅降低 CPU 使用率。
另外,請使用以下指令行選項以啟動代理程式:
- vmargs -verbose:gc
標準輸出會指出執行記憶體收回的時間。
若要解決此問題:在具有多個 CPU 的電腦中,設定同時執行記憶體收回:
-XX:+UseParallelGC=true
可能原因:JVM 使用及時 (Just-In-Time) 編譯器以提高效能。
若要確認此問題的原因:檢查是否有其他可能造成此問題的原因。
若要解決此問題:讓系統執行一段時間,效能應會改善。
徵兆:
用戶未收到產生器傳送的訊息。
可能原因:
可能原因:限制運作方式導致訊息在代理程式上被刪除。
目標記憶體中的訊息數目或訊息容量達到所配置的限制時,代理程式會嘗試節省記憶體資源。達到這些限制時,代理程式會採用 3 個可配置的運作方式,並因此導致訊息遺失:
REMOVE_OLDEST:刪除最舊的訊息。
REMOVE_LOW_PRIORITY:根據訊息存在時間,刪除優先權最低的訊息。
REJECT_NEWEST:拒絕新的永久性訊息。
若要確認此問題的原因:如停用的訊息佇列包含訊息中所描述,檢查停用的訊息佇列。尤其必須遵照「訊息數目或訊息容量超出目標限制」中的指示。尋找 REMOVE_OLDEST 或 REMOVE_LOW_PRIORITY 原因。
若要解決此問題:增加目標限制。例如:
imqcmd update dst -n MyDest - o maxNumMsgs=1000
可能原因:訊息的逾時值過期。
代理程式會刪除逾時值過期的訊息。如果目標積存了太多的訊息,則可能會刪除存在時間值過短的訊息。
若要確認此問題的原因:使用 QBrowser 示範應用程式,查看停用的訊息佇列內容及訊息是否逾時。如需 QBrowser 示範程式在特定平台上的位置,請參閱附錄 AMessage QueueTM 資料的特定平台位置,查看表格中的「應用程式範例與位置」。
以下是 Windows 平台上的呼叫範例:
cd \MessageQueue3\demo\applications\qbrowser java QBrowser
QBrowser 主視窗出現時,請選擇佇列名稱 mq.sys.dmq,然後按一下 [瀏覽]。會出現類似下面的清單:
在任何訊息上連按兩下,即可顯示此訊息的詳細資訊。
請注意訊息 JMS_SUN_DMQ_UNDELIVERED_REASON 特性的值是否為 EXPIRED。
若要解決此問題:連絡應用程式開發者並增加使用期限值。
可能原因:時鐘不同步。
如果時鐘不同步,代理程式計算訊息的使用期限會發生錯誤,如此會導致訊息逾時並被刪除。
若要確認此問題的原因:查看代理程式記錄檔中有無下列訊息:B2102、B2103、B2104。這些訊息都報告偵測到時鐘可能不準。
若要解決此問題:如準備系統資源中所述,檢查有無執行時間同步化程式。
可能原因:訊息使用用戶端無法啟動連線上的訊息傳送。
在用戶端程式碼建立連線並啟動該連線上的訊息傳送之前,將無法傳送訊息。
若要確認此問題的原因:檢查用戶端程式碼是否建立連線並啟動訊息傳送。
若要解決此問題:重新寫入用戶端程式碼,以建立連線並啟動訊息傳送。
徵兆:
您列出目標時,發現停用的訊息佇列中包含訊息。例如,發出下列指令:
imqcmd list dst
提供使用者名稱和密碼之後,出現類似下面的輸出:
Listing all the destinations on the broker specified by: --------------------------------- Host Primary Port --------------------------------- localhost 7676 ---------------------------------------------------------------------- Name Type State Producers Consumers Msgs Total Count UnAck Avg Size ------------------------------------------------- ---------------------- MyDest Queue RUNNING 0 0 5 0 1177.0 mq.sys.dmq Queue RUNNING 0 0 35 0 1422.0 Successfully listed destinations. |
在此範例中,停用的訊息佇列 mq.sys.dmq 包含 35 個訊息。
可能原因:
可能原因:訊息數目或訊息容量超出目標限制。
若要確認此問題的原因:使用 QBrowser 示範應用程式,查看停用的訊息佇列內容。如需 QBrowser 示範程式在特定作業系統上的位置,請參閱附錄 AMessage QueueTM 資料的特定平台位置,查看表格中的「應用程式範例與位置」。
以下是 Windows 平台的呼叫範例:
cd \MessageQueue3\demo\applications\qbrowser java QBrowser
QBrowser 主視窗出現時,請選擇佇列名稱 mq.sys.dmq,然後按一下 [瀏覽]。出現的清單與先前在「訊息的逾時值過期」下顯示的清單類似。連按兩下任何訊息,以顯示此訊息的詳細資訊,如「訊息的逾時值過期」下所示。
請注意下列訊息特性值:
JMS_SUN_DMQ_UNDELIVERED_REASON
JMS_SUN_DMQ_UNDELIVERED_COMMENT
JMS_SUN_DMQ_UNDELIVERED_TIMESTAMP
請注意 JMS Headers 下的 JMSDestination 值,以便判斷將要停用其訊息的目標。
若要解決此問題:增加目標限制。例如:
imqcmd update dst - n MyDest -o maxNumMsgs=1000
可能原因:代理程式時鐘和產生器時鐘不同步。
若要確認此問題的原因:使用 QBrowser 應用程式,檢視停用的訊息佇列中訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值,尋找原因為 EXPIRED 的訊息。
查看代理程式記錄檔中有無下列訊息:B2102、 B2103、B2104。這些訊息都報告偵測到時鐘可能不準。
若要解決此問題:如準備系統資源中所述,檢查有無執行時間同步化程式。
可能原因:用戶在訊息逾時前一直未收到訊息。
若要驗證此問題的原因:使用 QBrowser 應用程式,檢視停用的訊息佇列中訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值,尋找原因為 EXPIRED 的訊息。
檢查目標上有無任何用戶。例如:
imqcmd query dst -t q -n MyDest
檢查列出的 Current Number of Active Consumers 值。如果有使用中的用戶,下列其中一項為 true:
用戶連線暫停。
訊息逾時過短,無法配合用戶的執行速度。
若要解決此問題:請應用程式開發者增加訊息存在時間值。
可能原因:產生器數目對於用戶數目而言過多。
若要確認此問題的原因:使用 QBrowser 應用程式,檢視停用的訊息佇列中訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值。如果原因是 REMOVE_OLDEST 或 REMOVE_LOW_PRIORITY ,請使用 imqcmd query dst 指令,檢查目標上的產生器數目和用戶數目。如果產生器數目超過用戶數目,產生速率可能高於使用速率。
若要解決此問題:使用如下所示的指令,增加更多的訊息使用用戶端,或將目標的限制運作方式設定為 FLOW_CONTROL (以使用速率控制產生速率):
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
可能原因:產生器的速度比用戶快。
若要確認此問題的原因:若要判斷是否因為用戶速度慢而導致產生器的速度變慢,請使用如下所示的指令,將目標的限制運作方式設定為 F LOW_CONTROL (以使用速率控制產生速率):
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
利用如下所示的指令,使用度量來檢查目標的輸入與輸出:
imqcmd metrics dst - n myDst -t q -m rts
在度量輸出中,檢查下列的值:
Msgs/sec Out:顯示代理程式每秒移除多少訊息。所有用戶確認收到訊息後,代理程式便移除訊息,讓度量反映使用速率。
Msgs/sec In:顯示代理程式每秒從產生器接收多少訊息。度量會反映產生速率。
流量控制會針對使用調整產生,注意產生速度是否變慢或停止。如果產生速度變慢或停止,則表示產生器和用戶的處理速度有差異。您也可以使用 imqcmd list dst 指令,檢查已傳送的未確認 (UnAcked) 訊息數目。如果未確認的訊息數目小於目標容量,表示目標有其他容量受到用戶端的流量控制所控制。
若要解決此問題:如果產生速率一直快於使用速率,請考慮定期使用流量控制讓系統步調一致。後續幾節介紹如何解決下面的可能因素:
可能原因:用戶的速度太慢。
若要確認此問題的原因:如「產生器的速度比用戶快」中所描述,使用度量來判斷產生速率和使用速率。
若要解決此問題:
使用以下所示的指令,將目標的限制運作方式設定為 FLOW_CONTROL:
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
使用流量控制功能以根據使用速率減慢產生速率,防止在代理程式上累積訊息。產生器應用程式會保留訊息,直到目標可以處理這些訊息為止,以降低過期風險。
向應用程式開發者詢問產生器是以固定的速率傳送訊息,或是定期以資料組的方式傳送訊息。如果應用程式是以資料組的方式傳送訊息,請按照下一項目的指示,增加目標限制。
根據訊息的數目和 (或) 位元組,增加目標限制。若要變更目標的訊息數目,請輸入下列格式的指令:
imqcmd update dst - n destName -t {q|t} -o maxNumMsgs=number
若要變更目標的容量,請輸入下列格式的指令:
imqcmd update dst -n destName -t {q|t} -o maxTotalMsgBytes=number
請注意,提高限制會增加代理程式使用的記憶體容量。如果限制太高,代理程式可能會用盡記憶體而無法處理訊息。
考慮在產生大量負載期間,能否承受訊息流失。
可能原因:用戶端未確定訊息。
若要確認此問題的原因:向應用程式開發者查詢應用程式是否使用作業事件。如果應用程式使用作業事件,請列出使用中作業事件,如下所示:
imqcmd list txn
下列是指令輸出的範例:
---------------------------------------------------------------------- Transaction ID State User name # Msgs/# Acks Creation time ---------------------------------------------------------------------- 6800151593984248832 STARTED guest 3/2 7/19/04 11:03:08 AM |
請注意訊息和確認的數目。如果訊息數目大於確認數目,表示產生器可能有傳送個別訊息,但卻無法確定作業事件。代理程式收到確定後,才能路由並傳送該項作業事件的訊息。如果確認數目大於訊息數目,表示用戶可能有傳送個別訊息,但卻無法確定作業事件。代理程式收到確定後,才能移除該項作業事件的確認。
若要解決此問題:請連絡應用程式開發者,修正程式錯誤。
可能原因:用戶無法確認訊息。
若要確認此問題的原因:連絡應用程式開發者,判斷應用程式使用系統型確認或用戶端型確認。如果應用程式使用系統型確認,請略過本節。如果應用程式使用用戶端型確認 (CLIENT_ACKNOWLEDGE),請使用如下所示的指令,先減少用戶端上儲存的訊息數目:
imqcmd update dst -n myDst -t q -o consumerFlowLimit=1
然後判斷是因為用戶的速度太慢而使代理程式緩衝訊息,或是用戶處理訊息的速度很快,只是未確認訊息。使用下列指令,列出目標:
imqcmd list dst
提供使用者名稱和密碼之後,出現類似下列的輸出:
Listing all the destinations on the broker specified by: --------------------------------- Host Primary Port --------------------------------- localhost 7676 ---------------------------------------------------------------------- Name Type State Producers Consumers Msgs Total Count UnAck Avg Size ------------------------------------------------ ----------------------- MyDest Queue RUNNING 0 0 5 200 1177.0 mq.sys.dmq Queue RUNNING 0 0 35 0 1422.0 Successfully listed destinations. |
UnAck 數目代表代理程式傳送出去後等待確認的訊息數目。如果此數目變大或增加,表示代理程式正在傳送訊息,不等待速度較慢的用戶。您也可以看出用戶未確認訊息。
若要解決此問題:請連絡應用程式開發者,修正編碼錯誤。
可能原因:長期用戶處於非使用中狀態。
若要確認此問題的原因:使用下列的指令格式,查看主題的長期訂閱者:
imqcmd list dur -d topicName
若要解決此問題:
使用 imqcmd purge dur 指令,清除長期用戶。
重新啟動用戶應用程式。
可能原因:發生非預期的代理程式錯誤。
若要確認此問題的原因:如「產生器的速度比用戶快」中所描述,使用 QBrowser 檢查訊息。如果 JMS_SUN_DMQ_UNDELIVERED_REASON 的值是 ERROR ,表示代理程式發生錯誤。
若要解決此問題:
檢查代理程式記錄檔,尋找相關錯誤。
連絡 Sun 技術支援,報告代理程式的問題。