RabbitMQ Java客户端自动重新连接

RabbitMQ Java客户端自动重新连接,java,rabbitmq,Java,Rabbitmq,当我的应用程序断开与RabbitMQ的连接时,我将其连接工厂设置为自动尝试并重新连接 ConnectionFactory factory = new ConnectionFactory(); factory.setUsername(username); factory.setPassword(password); factory.setRequestedHeartbeat(1); factory.setConnectionTimeout(5000); fa

当我的应用程序断开与RabbitMQ的连接时,我将其连接工厂设置为自动尝试并重新连接

ConnectionFactory factory = new ConnectionFactory();
    factory.setUsername(username);
    factory.setPassword(password);
    factory.setRequestedHeartbeat(1);
    factory.setConnectionTimeout(5000);
    factory.setAutomaticRecoveryEnabled(true);
    factory.setTopologyRecoveryEnabled(true);
当它试图重新连接时,它会阻塞,但一旦再次连接,它就不会停止阻塞,我不知道为什么

我使用的是最新版本的java客户端3.3.4

当我通过rabbitmq管理接口强制断开客户端连接时,似乎也会发生这种情况


进一步的研究发现,当它试图获得一个频道时,它似乎被挂了起来,但网络界面上显示有一个频道连接。

总而言之,这里是我的答案

首先,rabbitmq,或者至少java客户机,有一些奇怪的默认属性,有时以秒为单位,有时以毫秒为单位。而且,在我看来,它们的默认值似乎没有经过深思熟虑。例如,
connectionTimeout
s的默认值是0,这意味着永远等待

您还应该在您的环境中将
networkRecoveryInterval
属性设置为一些有用的值

要获得导致通道关闭的更多信息,请实现一个-即使它只是打印异常,它也将帮助您找出导致错误的原因

为了测试连接的自动恢复,我在客户端使用了ip tables命令。然后,您还可以在rabbitmq.log中看到服务器端发生了什么

不要忘了调整
requestHeartbeet
属性,在我的设置中它总是超过5秒,默认值是在一些客户端实现中580秒,这似乎有点奇怪,请记住


无论如何,即使在集群中运行rabbitmq,它也无法在不可靠的网络上正常工作。也许您对此感兴趣,而不是我建议您查看的。

您的
networkRecoveryInterval
属性如何?还考虑将请求HealBET设置为生产环境中的一秒钟以上……YUP,这只是目前的测试。实际上,我刚刚将networkRecoveryInterval设置为0,现在它实际上在无法重新连接时抛出了一个错误,这是一个开始。然而,一旦它最终重新连接,它似乎仍然挂起。我成功地完成了线程转储,这是rabbitmq唯一能找到的添加ShutdowListener以获取更多信息的方法:顺便说一句,rabbitmq有一些奇怪的默认属性,例如connectionTimeout的默认值为0,这意味着如果有,将无限等待。我不太确定拓扑恢复是否启用,你能用默认值试试吗?这很奇怪。如果我手动优雅地停止rabbitmq,自动恢复显然无法正常工作。但是如果我断开与网络的连接,它工作得非常好。这看起来相当奇怪,当我手动停止rabbitmg时,我从关闭监听器得到了带有“shutdown”原因的代理强制连接关闭。但一旦我重新打开rabbitmq,它将重新连接并重新生成队列,但不允许任何其他更新:看起来更高版本(目前为4.1.0)至少在默认情况下将连接超时设置为60秒,而不是0秒。谢谢你的信息。