【问题标题】:Automatically reconnect RabbitMQ channels自动重新连接 RabbitMQ 通道
【发布时间】:2013-03-09 21:17:49
【问题描述】:

我找到了这个宝石:

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

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

【问题讨论】:

  • 我不确定我是否了解有关频道的问题。它们就像连接精简版。因此,如果您断开连接,那么您也将失去您的频道。
  • 你有没有想过这个问题?还是您编写了自动重新连接层?有机会分享一下吗?
  • @StFS 我写了一个 very kludgey 重新连接层。在这一点上对我来说开源并不是特别容易,但我很乐意提供建议 - 在programmers.SE上发布一个问题,寻求设计这一层的帮助,我会回复。

标签: java rabbitmq


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 能否保持消费者当前是否正在消费等状态?
    • @djechlin 绝对 - 当前正在消费的所有消费者都已恢复。
    【解决方案3】:

    截至RabbitMQ 3.3.0(2014 年 4 月),这可以通过 Java 客户端实现。

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

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

    【讨论】:

      【解决方案4】:

      是的,我同意这是当前 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(或任何其他消息传递)库交互的全新方式。当我完成这方面的一些工作时,我会通知你,可能需要几个月的时间。

      【讨论】:

      • 你说过你会让我们知道的。这曾经发生过吗?
      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2020-07-17
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多