自动重新连接RabbitMQ频道

我找到了这个gem:

如果连接失败,客户端将需要与代理建立新连接。 在先前连接上打开的任何频道都将自动关闭,这些频道也需要重新打开。

所以那不好。 我即将编写一大堆处理自动重新连接并重新创建通道,然后从我的所有代码中封装这种情况。 问题是,这应该已经完成​​了。 这可能在Java RMQ库中吗?

查看Lyra :高可用性RabbitMQ客户端,可在意外关闭时自动恢复资源(连接/渠道/消费者)。

也许这是RabbitMQ客户端的一个新function,但我在他们的文档中发现了这一点:

要启用自动连接恢复,请使用factory.setAutomaticRecoveryEnabled(true):

https://www.rabbitmq.com/api-guide.html

看起来应该解决问题。

从RabbitMQ 3。3。0 (2014年4月)开始,这可以通过Java客户端实现。

这个版本。 。 。 允许基于Java的客户端在网络故障后自动重新连接。

我不知道这是否是仅服务器的更改,仅对客户端库进行更改才能实现此目的,等等。仍在研究中。

是的,我同意这是当前RabbitMQ客户端实现的主要缺点。 我已经使用RMQ大约2年了(.NET库),并且在那段时间里没有太多变化。 它需要从头开始完全重写,我还没有时间去做。

但我确实有一些指示。 首先,我将为您的连接/通道对象创建一个包装类(您需要通道进行AMQP操作,连接的唯一用途是创建通道)。 然后,您的包装器类可以跟踪通道或连接是否打开,并相应地执行操作。

我的代码最终看起来像这样:

while (_iNeedToBeSendingAndReceiving) { try { //This blocks indefinitely while waiting for a connection. using (var channel = ConnectionWrapper.CreateChannel(string connectionString) { //Do stuff, blah, blah //When the connection or channel closes, an exception is thrown and //I move to the catch block. } catch(ConnectionInterruptException ex) { //Eat, yummy! } } 

我最终的计划是抽象出这些东西,并创建一种与RabbitMQ(或任何其他消息传递)库交互的全新方式。 我会告诉你,当我完成一些工作时,可能需要几个月的时间。