我发现这个宝石:自动重新连接的RabbitMQ渠道
连接失败的情况下,客户将需要建立与代理的新连接。上一个连接上打开的任何频道都将自动关闭,这些频道也需要重新打开。
所以这并不好。我即将编写一个处理自动重新连接和重新创建通道的大图层,然后将所有代码封装起来。问题是,这应该已经完成了。这在Java RMQ库中可能吗?
我发现这个宝石:自动重新连接的RabbitMQ渠道
连接失败的情况下,客户将需要建立与代理的新连接。上一个连接上打开的任何频道都将自动关闭,这些频道也需要重新打开。
所以这并不好。我即将编写一个处理自动重新连接和重新创建通道的大图层,然后将所有代码封装起来。问题是,这应该已经完成了。这在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的(或任何其他消息)库交互的一种全新的方式。当我在这方面做了一些工作时,我会告诉你,可能要几个月。
你说你会让我们知道。这是否发生过? – 2015-09-16 14:10:52
从RabbitMQ 3.3.0(2014年4月)开始,这对Java客户端来说是可能的。
此版本。 。 。允许基于Java的客户端在网络故障后自动重新连接。
我不知道这是否是仅服务器更改,仅对客户端库进行了更改才使此成为可能,等等。仍在研究。
也许这是RabbitMQ的客户端的新功能,但我发现这在他们的文档:
要启用自动连接恢复,使用 factory.setAutomaticRecoveryEnabled(真):
https://www.rabbitmq.com/api-guide.html
看起来应该可以解决问题。
我不确定我是否遵循这里关于渠道的问题。他们就像连接精简版。所以如果你断开连接,你也会失去你的频道。 – robthewolf 2013-03-11 11:06:19
你有没有想过这个?或者你是否编写了自动重新连接层?你有机会分享它吗? – StFS 2013-07-16 16:25:51
@StFS我写了一个*非常* kludgey重新连接层。对于我来说,在这一点上开源并不是那么容易,但我很乐意提供建议 - 向程序员发布一个问题。寻求设计这一层的帮助,我会回复。 – djechlin 2013-07-16 16:32:16