gpt4 book ai didi

java - Spring DefaultMessageListenerContainer、ActiveMQ 和消息重传

转载 作者:行者123 更新时间:2023-12-04 06:59:01 24 4
gpt4 key购买 nike

如果我使用 DefaultMessageListenerContainer Spring要接收 JMS 消息,即使我设置了 sessionAcknowledgeMode,我也不会重新发送 JMS 消息。到 2。

如果是 RuntimeExceptiononMessage()在我的 JavaBean 中,消息在 JMS 提供程序( ActiveMQ )中没有得到确认,它在队列中保持挂起状态。但它永远不会重新交付,我认为这是由于 Spring 从不调用 session.recover() 造成的。 ,根据 ActiveMQ's documentation需要是重新交付发生所必需的。

任何人都可以给我一个提示,我可以如何配置DefaultMessageListenerContainer调用 session.recover()在运行时异常的情况下?

此致,
马丁

最佳答案

您表示您正在使用 sessionAcknowledgeMode 2,即 Session.CLIENT_ACKNOWLEDGE。以下陈述直接摘自AbstractMessageListenerContainer Javadocs :

  • "CLIENT_ACKNOWLEDGE":监听器执行成功后自动确认消息;在抛出异常的情况下不重新发送。

  • 所以问题不在于 Spring DMLC,它能够在抛出运行时异常时调用 Session.recover()。您是否可以通过自己调用 Session.recover() 在监听器的 onMessage() 方法中使用 try/catch 来处理运行时异常?
    更新:
    您对样板代码提出了很好的观点。它散布在许多地方并要求重构。你不可能抽象出这样的代码吗?这是一个常见的解决方案。使用包含具有适当处理的 try/catch 的方法创建抽象父类应该可以解决问题。然后只需扩展父类以根据需要实现尽可能多的自定义处理器。然后,您甚至可以使用 Spring 应用程序上下文以适当的方式将处理器连接在一起。
    我从来没有遇到过将特定于 Spring 的代码添加到应用程序的问题,因为它可以在任何地方运行。当我开始使用 Spring 时,这对我很重要。它并不特定于任何单个应用程序服务器或 servlet 容器,因此我不会像将 com.ibm 或 com.oracle 导入到我的源代码中那样将自己编码到 Spring 的一个角落。事实上,我已经将 Spring JMS API 与一个 MOM 一起使用并切换到另一个 MOM,除了 JMS 连接工厂定义之外没有更改任何其他内容。

    关于java - Spring DefaultMessageListenerContainer、ActiveMQ 和消息重传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2183329/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com