2013-03-09 141 views
7

我发现这个宝石:自动重新连接的RabbitMQ渠道

连接失败的情况下,客户将需要建立与代理的新连接。上一个连接上打开的任何频道都将自动关闭,这些频道也需要重新打开。

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

+0

我不确定我是否遵循这里关于渠道的问题。他们就像连接精简版。所以如果你断开连接,你也会失去你的频道。 – robthewolf 2013-03-11 11:06:19

+0

你有没有想过这个?或者你是否编写了自动重新连接层?你有机会分享它吗? – StFS 2013-07-16 16:25:51

+0

@StFS我写了一个*非常* kludgey重新连接层。对于我来说,在这一点上开源并不是那么容易,但我很乐意提供建议 - 向程序员发布一个问题。寻求设计这一层的帮助,我会回复。 – djechlin 2013-07-16 16:32:16

回答

1

是的,我同意这是当前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的(或任何其他消息)库交互的一种全新的方式。当我在这方面做了一些工作时,我会告诉你,可能要几个月。

+0

你说你会让我们知道。这是否发生过? – 2015-09-16 14:10:52

6

结账Lyra:高可用性RabbitMQ客户端在意外关闭时自动恢复资源(连接/通道/使用者)。

+0

它可以像消费者目前消费一样保持状态吗? – djechlin 2013-10-24 21:36:27

+0

@djechlin绝对 - 任何目前消费的消费者都被追回。 – Jonathan 2014-04-03 00:23:01

2

RabbitMQ 3.3.0(2014年4月)开始,这对Java客户端来说是可能的。

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

我不知道这是否是仅服务器更改,仅对客户端库进行了更改才使此成为可能,等等。仍在研究。

6

也许这是RabbitMQ的客户端的新功能,但我发现这在他们的文档:

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

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

看起来应该可以解决问题。