如果ActiveMQ服务器关闭,您应该如何处理从应用程序向ActiveMQ发送JMS消息的重试?

时间:2017-05-31 13:56:19

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

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

然而

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

建议我的应用程序在成功之前一直尝试将消息重新发送到ActiveMQ的建议方法是什么?这是我必须自己开发的应用程序吗?是否有任何漂亮的Spring工具或注释为我这样做?有关最佳实践的建议或我应该如何处理这种情况?

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:2)

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

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

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

如果您不丢失此消息至关重要,则需要将其保存到某个备用持久性存储(例如,文件系统,本地mq服务器)以及您提供的任何重试代码。但对于那些偶然的网络故障或非常临时的mq关闭/重启,仅Spring-Retry应该可以解决这个问题。

答案 2 :(得分:0)

将故障转移添加到网址是一种合适的方法。

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