代码之家  ›  专栏  ›  技术社区  ›  Martin Carpella

Spring默认消息ListenerContainer、ActiveMQ和消息重新传递

  •  2
  • Martin Carpella  · 技术社区  · 16 年前

    如果我使用 DefaultMessageListenerContainer 属于 Spring 要接收JMS消息,即使设置了 sessionAcknowledgeMode 到2。

    万一A RuntimeException onMessage() 对于我的JavaBean,消息在JMS提供程序中未被确认( ActiveMQ ,它在队列中保持挂起状态。但它永远不会被重新交付,我认为这是因为春天从不召唤 session.recover() ,根据 ActiveMQ's documentation 需要进行重新交付。

    任何人都能给我一个如何配置的提示吗 默认消息侦听器容器 打电话 session.recover()。 如果出现runtimeexceptions?

    最好的问候,
    马丁

    1 回复  |  直到 14 年前
        1
  •  3
  •   Bill the Lizard    14 年前

    您表示正在使用sessionacknowledgeMode 2,即session.client_acknowledge。以下声明直接取自 AbstractMessageListenerContainer Javadocs 以下内容:

    • “客户机确认”:成功执行侦听器后自动确认消息;发生异常时不重新传递。

    因此,问题不在于SpringDMLC,而在于它能够在抛出运行时异常时调用session.recover()。您是否可以在侦听器的onMessage()方法中使用try/catch自己调用session.recover()来处理运行时异常?

    更新:

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

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