Java Spring DefaultMessageListenerContainer、ActiveMQ和消息重新传递

Java Spring DefaultMessageListenerContainer、ActiveMQ和消息重新传递,java,spring,exception-handling,jms,activemq,Java,Spring,Exception Handling,Jms,Activemq,如果使用of接收JMS消息,则不会重新传递JMS消息,即使我将sessionackknowledgemode设置为2 如果在我的JavaBean的onMessage()中出现RuntimeException,则消息在JMS提供程序()中未被确认,它在队列中保持为挂起状态。但它从未被重新交付,我认为这是因为Spring从未调用session.recover(),根据需要,这是重新交付所必需的 有人能告诉我如何配置DefaultMessageListenerContainer以在出现运行时异常时调用

如果使用of接收JMS消息,则不会重新传递JMS消息,即使我将
sessionackknowledgemode
设置为2

如果在我的JavaBean的
onMessage()
中出现
RuntimeException
,则消息在JMS提供程序()中未被确认,它在队列中保持为挂起状态。但它从未被重新交付,我认为这是因为Spring从未调用
session.recover()
,根据需要,这是重新交付所必需的

有人能告诉我如何配置
DefaultMessageListenerContainer
以在出现运行时异常时调用
session.recover()

致以最诚挚的问候,

Martin

您表示正在使用sessionAcknowledgeMode 2,即Session.CLIENT\u ACKNOWLEDGE。以下声明直接摘自:

  • “客户端确认”:侦听器成功执行后自动确认消息;在引发异常的情况下不重新交付
因此,问题不在于Spring DMLC,而在于它能够在引发运行时异常时调用Session.recover()。您是否可以在侦听器的onMessage()方法中使用try/catch,通过自己调用Session.recover()来处理运行时异常

更新: 关于样板代码,您提出了一个很好的观点。它被散布在许多地方,并请求进行重构。你不可能抽象出这样的代码吗?这是一个常见的解决方案。用一个包含try/catch的方法创建一个抽象父类,并进行适当的处理应该可以做到这一点。然后只需扩展父类以实现所需数量的自定义处理器。您甚至可以使用Spring应用程序上下文以适当的方式将处理器连接在一起


我从未遇到过向应用程序添加特定于Spring的代码的问题,因为它可以在任何地方运行。当我开始使用弹簧时,这对我很重要。它并不特定于任何单个应用程序服务器或servlet容器,因此,如果我将com.ibm或com.oracle导入到源代码中,我就不会像在Spring中那样将自己编码到一个角落。事实上,我在一个MOM中使用了Spring JMS API,并在不更改JMS连接工厂定义的情况下切换到了另一个MOM。

谢谢,我知道这个可能的解决方案(抱歉,我没有写这个),但它将锅炉板代码添加到我使用的每个bean中,并强制我使用
SessionAwareMessageListener
(这是一个Spring依赖项)与javax.jms.MessageListener不同,老实说,我不想直接在消息处理器中引入Spring依赖项。我有一个类似的问题。SessionAwareListener会抛出一个意外的运行时异常,但DMLC会在停止之前重试消息大约32次。不确定如何设置重试数字。。。?