尽管心跳设置,RabbitMQ连接仍然会丢失并且无法恢复

时间:2015-02-19 19:01:56

标签: java spring rabbitmq spring-amqp

我正试图解决在我们的生产环境中丢弃与RabbitMQ的消费者连接的问题。运行几天之后似乎会出现此问题,并且通过重新启动我们的应用程序,它似乎连接并且可以再工作几天。我的猜测是,有一段时间不活动导致了这个问题。似乎AMQP心跳是专为此问题而设计的。我们使用spring-amqp 1.3.2.RELEASE并将ConnectionFactory上的requestedHeartbeat设置为10但是我们仍然看到连接丢失。

如果我完全断开与互联网的连接并重新连接或阻止与防火墙的连接,spring-amqp客户端将重新连接,但是当生产中发生这种情况时,它似乎甚至不会在日志中抛出异常。当然,这可能是因为我们正在使用slf4j和logback作为我们的日志记录机制,而spring正在使用commons日志记录,所以它出现在System.out中而不是去日志。我已经添加了jcf-over-slf4j桥来解决这个问题,但还没有推出它,所以我没有堆栈跟踪来贡献。

关于我们架构的另一条​​信息:我们在RabbitMQ前面有HA代理。

我想以某种方式将应用程序置于调试中并在eclipse中运行,以查看心跳是否实际发生。我尝试使用Wireshark进行验证,但我们的流量采用双向SSL加密,但我还无法解密流量。

有没有人有任何建议?我一直在尝试将其运行数周,而我的想法已经不多了。我非常感谢您的意见。

谢谢!

2 个答案:

答案 0 :(得分:2)

在2015年2月11日之前,兔子发布了3.4.4,它支持自动重新连接。您可以像我们之前做的那样推出自己的解决方案,但升级到最新版本的兔子似乎更容易。

https://github.com/rabbitmq/rabbitmq-dotnet-client/blob/rabbitmq_v3_4_4/projects/client/RabbitMQ.Client/src/client/impl/AutorecoveringConnection.cs

答案 1 :(得分:2)

如果启用了rabbitmq autorecovery,则1.4之前的Spring AMQP与它不兼容;问题是兔子恢复连接/通道,但Spring AMQP不知道它们。但一般情况下,这只会导致额外的连接/通道 - Spring AMQP只会建立新的通道。我没有听说过它会导致你描述的问题。

如果您无法通过修复日志记录配置来解决这个问题,那么另外要尝试的是jstack您的进程以查看线程正在执行的操作。但是你应该能够从日志中找到它。