Java jms错误处理程序:仅当jms放弃时接收回调

Java jms错误处理程序:仅当jms放弃时接收回调,java,spring,jms,activemq,Java,Spring,Jms,Activemq,我将SpringJMS与活动mq一起使用 我设置了一个ErrorHandler侦听器,每当jms消息传递失败时,它都会收到一个回调,即处理消息的方法会抛出一个异常,而不是正常返回 但是,我的jms被配置为重试多次,直到jms交付最终成功。我的回调会收到所有失败的通知 我想要的是一个只在所有重试最终失败时才接收通知的侦听器。动机是将问题提交给管理员。但我不希望在管理员控制台中出现虚假通知 <bean abstract="true" id="abstractDestinationListene

我将SpringJMS与活动mq一起使用

我设置了一个
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>


<>代码> 您可以考虑使用目的地死信队列(<代码> MaulalDealLeTeLead策略< /代码>)来讨论所讨论的目的地。当达到最大重新交付计数时,消息将移出DLQ。然后,您可以在该队列上设置一个消费者,该消费者有一个向管理员发送电子邮件的侦听器


另一种方法可能是用try-catch包装您的侦听器,只有在
message.getIntProperty(“JMSXDeliveryCount”)
的情况下才重新显示任何异常,并以其他方式向管理员发送电子邮件。但是,该选项意味着将您的重新交付限制放在两个位置—代理配置和代码

如果您需要更细粒度的控制/灵活性/JMS消息传递/处理路由,那么您应该使用ApacheCamel的…

+1作为第一个(尽管比我预期的更复杂)。关于第二个错误处理程序,错误处理程序无法访问jms消息本身,只能访问抛出的异常。对不起,我应该更明确一点——对于第二个错误处理程序,异常处理逻辑需要在消息侦听器中,而不是在Spring错误处理程序中。