【问题标题】:How should you handle the retry of sending a JMS message from your application to ActiveMQ if the ActiveMQ server is down?如果 ActiveMQ 服务器关闭,您应该如何处理从应用程序向 ActiveMQ 发送 JMS 消息的重试?
【发布时间】:2017-06-02 00:26:15
【问题描述】:

因此,使用 JMS 和 ActiveMQ,我可以确保使用 JmsTemplate 从 Spring Boot 应用程序发送的消息将到达它的目标应用程序,即使在我将消息发送到 ActiveMQ 时目标应用程序已关闭。当目标应用程序启动时,它会从队列中获取消息。太好了!

但是。

如果我的 Spring Boot 应用程序尝试将 JMS 消息发送到 ActiveMQ 服务器上的队列,但此时 ActiveMQ 服务器已关闭或网络已关闭并且我收到连接被拒绝异常,会发生什么情况?

推荐的方法是确保我的应用程序不断尝试将消息重新发送到 ActiveMQ 直到成功?这是我必须自己开发到我的应用程序中的东西吗?是否有任何漂亮的 Spring 工具或注释可以为我做到这一点?关于最佳实践或我应该如何处理这种情况的任何建议?

【问题讨论】:

    标签: spring spring-boot jms activemq spring-jms


    【解决方案1】:

    你可以试试 Spring-Retry。有很多细粒度控制:

    http://www.baeldung.com/spring-retry

    https://github.com/spring-projects/spring-retry

    如果您不丢失此消息至关重要,您将希望将其与您想出的任何重试代码一起保存到其他持久性存储(例如文件系统、本地 mq 服务器)。但是对于那些偶尔的网络故障或非常临时的 mq 关闭/重启,单独使用 Spring-Retry 应该可以解决问题。

    【讨论】:

    • 谢谢。尽管其他答案也很有帮助,但您的答案专门解决了我的担忧,即我的应用程序服务器由于网络问题而无法连接。仅拥有故障转移 ActiveMQ 服务器对这种情况没有帮助,但是,您的建议确实给了我一些方向。
    【解决方案2】:

    我能想到的几种方法
    1. 您可以设置另一个 ActiveMq 作为后备。在您的代码中,您无需执行任何操作,只需从

    更改您的代理 url
     activemq.broker.url=tcp://amq01.blah.blah.com:61616
    

    activemq.broker.url=failover:(tcp://amq01.blah.blah.com:61616,tcp://amq02.blah.blah.com:61616)?randomize=false  
    

    其余的会自动处理。即当其中一个关闭时,消息将发送给另一个。

    1. 另一种方法是在 activemq 关闭时发送到内部队列(如 seda、direct)并从那里读取。

    【讨论】:

      【解决方案3】:

      向 url 添加故障转移是一种合适的方式。

      另一个合理的方法是确保activemq始终在线,因为activemq具有主从模式(http://activemq.apache.org/masterslave.html)以获得高可用性。

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 2014-02-08
        • 2017-01-10
        • 1970-01-01
        • 2020-12-09
        • 2012-08-06
        • 2013-08-10
        • 2011-07-24
        • 2016-07-09
        相关资源
        最近更新 更多