2013-03-03 44 views
4

我正在使用帶有活動mq的spring-jms。jms錯誤處理程序:只有當jms放棄時纔會收到回調

我有一個ErrorHandler偵聽器設置,每次jms消息傳遞失敗時都會收到一個回調 - 即處理消息的方法拋出異常而不是正常返回。

但是我的jms被配置爲重試幾次,直到jms傳遞最終成功。我的回調被通知所有的失敗。

我想要的是隻有當所有重試最終失敗時才接收通知的偵聽器。的動機是爲管理員的注意力提出問題。但我不想在管理員控制檯中發送虛假通知。

<bean abstract="true" id="abstractDestinationListener" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsFactory" /> 
    <property name="errorHandler" ref="destinationErrorHandler"/> 
    <property name="sessionTransacted" value="true"/> 
</bean> 

回答

2

您可以使用每個目的地死信隊列(individualDeadLetterStrategy - https://activemq.apache.org/message-redelivery-and-dlq-handling.html)考慮哪些有問題的目的地。當最大的重新傳送計數已被命中時,該消息被移出到DLQ。然後,您可以使用向管理員發送電子郵件的偵聽器在該隊列上設置使用者。

另一種方法可能是將您的聽衆打包爲try-catch,並且只有在message.getIntProperty("JMSXDeliveryCount") < MAX_REDELIVERY_COUNT的情況下重新拋出任何異常,否則發送給管理員。但是,該選項意味着將您的重新交付限制放在兩個位置 - 代理配置和代碼。

+0

+1的第一個(雖然更加複雜,比我預期) 。關於第二個,錯誤處理程序本身不能訪問jms消息,而僅僅是拋出異常。 – flybywire 2013-03-04 17:30:48

+0

對不起,我應該更清楚一點 - 第二個例外,異常處理邏輯需要放在消息監聽器中,而不是Spring錯誤處理程序。 – 2013-03-05 10:53:28

0

,如果您需要更細粒度的控制/靈活/與JMS消息/處理路由,那麼你應該只使用Apache的駱駝的error handling ...