徵兆:
您列出目標時,發現停用的訊息佇列中包含訊息。例如,發出下列指令:
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 技術支援,報告代理程式的問題。