Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动重新连接RabbitMQ通道_Java_Rabbitmq - Fatal编程技术网

Java 自动重新连接RabbitMQ通道

Java 自动重新连接RabbitMQ通道,java,rabbitmq,Java,Rabbitmq,我发现了这个宝石: 在连接失败的情况下,客户端需要建立到代理的新连接。在上一次连接上打开的所有通道都将自动关闭,这些通道也需要重新打开 所以这不好。我将要写一个处理自动重新连接和重新创建通道的大层,然后封装我所有代码中发生的事情。问题是,这应该已经完成了。这在Java RMQ库中可能吗?是的,我同意这是当前RabbitMQ客户端实现的一个主要缺点。我已经使用RMQ大约2年了(在.NET库中),在这段时间里并没有太大的变化。它需要从头开始完全重写,而我只是还没有时间去做 但我有一些建议。首先,我将

我发现了这个宝石:

在连接失败的情况下,客户端需要建立到代理的新连接。在上一次连接上打开的所有通道都将自动关闭,这些通道也需要重新打开


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

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

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

从2014年4月起,Java客户端就可以实现这一点

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


我不知道这是否仅仅是一个服务器更改,是否仅仅是对客户端库的更改使之成为可能,等等。我仍在研究。

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

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


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

我不确定我是否了解有关频道的问题所在。它们就像是连接。所以,如果你断开连接,你也会失去你的频道。你有没有想过这一点?或者你写了你的自动重新连接层?你有机会分享吗?@StFS我写了一个非常笨拙的重连层。在这一点上,开放源码对我来说并不特别容易,但我很乐意提供建议-在programmers.SE上发布一个问题,请求帮助设计这一层,我会回答。它能保持消费者当前是否正在消费的状态吗?@djechlin肯定-任何当前正在消费的消费者都会恢复。你说过你会让我们恢复知道。这曾经发生过吗?