当我的应用程序失去与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管理界面强制断开客户端连接时,似乎也会发生这种情况。
一些进一步的研究似乎在试图获得一个频道时挂起,但网络界面说有一个频道连接。
答案 0 :(得分:10)
将它们全部包装在一起,这是我的答案。
首先,rabbitmq,或者至少是java客户端,有一些奇怪的默认属性,有时是几秒钟,有时是几毫秒。从我的观点来看,它们的默认值似乎也没有考虑过。例如connectionTimeout
的默认值为0,这意味着永远等待。
您还应该将networkRecoveryInterval
属性设置为您环境中的某个有用值。
要获得有关导致频道关闭的更多信息,请实施ShutdownListener
- 即使它只是打印异常,它也会帮助您找出导致错误的原因。
为了测试连接的自动恢复,我在客户端使用了ip tables命令。然后你还可以看到rabbitmq.log
中服务器端发生了什么并且不要忘记调整requestHeartbeet
属性,在我的设置中它总是超过5秒,默认的是在一些客户端实现580秒,这似乎有点奇怪,记住这一点。
无论如何,即使您在群集中运行rabbitmq,它也不能在不可靠的网络上运行良好。也许你对此有更多的兴趣,而不是建议你查看documentation。