11

我发现了这个宝石:

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

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

4

4 回答 4

9

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

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

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

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

于 2014-09-29T11:34:31.977 回答
7

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

于 2013-10-24T20:19:20.200 回答
2

RabbitMQ 3.3.0(2014 年 4 月)开始,Java 客户端可以做到这一点。

本次发布。. . 允许基于 Java 的客户端在网络故障后自动重新连接。

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

于 2014-07-03T16:57:20.230 回答
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(或任何其他消息传递)库交互的全新方式。当我完成这方面的一些工作时,我会告诉你的,可能需要几个月的时间。

于 2013-03-12T03:57:48.137 回答