徵兆:
傳送永久性訊息時,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 虛擬機器調整)。