2012-05-11 32 views
6

我正在使用Spring JMS連接到Websphere MQ服務器。我實現了SessionAwareListener接口來創建一個自定義偵聽器,爲業務邏輯重用舊代碼。如何限制JMS DefaultMessageListenerContainer將重試消息的次數?

在測試時,監聽器會拋出一個StringIndexOutOfBoundsException,這是我無法理解的。但是,我在日誌中看到下面打印了大約32次,然後DMLC停止。

WARN - Execution of JMS message listener failed 

有沒有辦法控制DMLC重試消息的頻率以及如何處理未捕獲的異常?

+0

那麼您是否正確使用IBM MQ JCA適配器?您的Spring應用程序在哪裏部署? – DaTroop

+0

不,我們只使用Websphere MQ,而不是應用程序服務器。 Spring應用程序是一個獨立的JVM。 –

回答

5

您可以隨時檢查JMSDeliveryCount。如果它超過了你認爲最大的數字,那麼就不要處理該消息並返回。

您也可以在configure your Websphere後嘗試將錯誤消息移至異常目標。

+0

感謝您的文章。這有助於看到後端發生了什麼。我現在使用JMSXDeliveryCount和JMSRedelivered JMS屬性來處理消息。 –

+0

你碰巧知道Spring API中的任何東西,也可以幫助錯誤處理? –

+0

不幸的是,我不太瞭解春天,我的朋友。 – DaTroop

5

在Websphere MQ世界中退出一條錯誤後將消息放回隊列退出

有兩個備選方案如何處理它:

  1. 在隊列管理器:您可以配置退出門檻回退重新排隊名稱爲給定隊列性能。達到退出閾值後,隊列管理器將把消息放入由退出請求名指定的隊列中,而不是重新傳送它。有關更多信息,請參閱WebSphere MQ queue properties

  2. 在您的應用程序中:如果您使用JMS API,請在開始處理消息之前通過調用msessage.getIntProperty("JMSXDeliveryCount")來檢查JMSXDeliveryCount屬性。如果達到某個閾值,則將該消息視爲錯誤。

+0

感謝您的迴應!你與DaTroop聯手解決了這個問題。 –

+0

在1上,對於重試限制,MQ屬性爲BOTHRESH,對於將在達到重試限制後轉發郵件的隊列,BOQNAME爲BOQNAME。 –