2013-03-03 43 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 ...