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肯定-任何当前正在消费的消费者都会恢复。你说过你会让我们恢复知道。这曾经发生过吗?