当我的应用程序失去与 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
属性在您的环境中具有一些有用的价值。
要获取导致通道关闭的更多信息,请实施ShutdownListener http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.3.4/rabbitmq-java-client-javadoc-3.3.4/com/rabbitmq/client/ShutdownListener.html- 即使它只是打印异常,它也会帮助您找出导致错误的原因。
为了测试连接的自动恢复,我在客户端使用了 iptables 命令。然后你还可以在rabbitmq.log中看到服务器端发生了什么
并且不要忘记调整requestHeartbeet
属性,在我的设置中它始终高于 5 秒,在某些客户端实现中默认值为 580 秒,这似乎也有点奇怪,请记住这一点。
无论如何,即使你在集群中运行rabbitmq,它在不可靠的网络上也不能很好地工作。也许您对这方面的兴趣比我建议您查看的更多文档 https://www.rabbitmq.com/reliability.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)