无法获得对锁定队列的独占访问

jan*_*res 4 spring spring-amqp

我有一个这样定义的匿名和独占队列:

@Bean 
    public SimpleMessageListenerContainer responseMessageListenerContainer(){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(simpleRoutingConnectionFactory());
        container.setQueues(responseAnonymousQueue());
        container.setMessageListener(rabbitTemplate());
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        container.setMessageConverter(jsonMessageConverter());
        return container;
    }

@Bean
    public Queue responseAnonymousQueue() { 
        return new MyAnonymousQueue();
    }
Run Code Online (Sandbox Code Playgroud)

有时我在rabbitmq日志中收到此错误:

=错误报告===== 2016年4月12日:: 15:13:42 ===连接<0.6899.0>上的通道错误(XX.XXX.57.1​​74:51716-> 192.168.100.145:5671,虚拟主机:' /',用户:'XXXX_USER'),频道1:{amqp_error,resource_locked,“无法获得对虚拟主机'/'中锁定队列'XXXX_USER-broad-1457bb43-6487-4252-b21a-a5a92d19e0dc'的独占访问”,“队列” 。宣布'}

因此,客户端无法声明队列,也无法从AMQP服务器接收消息。

在此消息之后发生:

=警告报告==== 2016年4月12日:: 15:11:51 ===关闭AMQP连接<0.6810.0>(XX.XXX.57.1​​74:17959-> 192.168.100.145:5671):connection_closed_abruptly

=信息报告==== 2016年4月12日:: 15:13:41 ===接受AMQP连接<0.6899.0>(XX.XXX.57.1​​74:51716-> 192.168.100.145:5671)

我无法重现它(我曾尝试关闭Rabbitmq的连接并拔下网络电缆,但应用程序再次重新连接良好),所以我不知道为什么会这样。假设在连接关闭时删除了专用队列和专用队列,为什么会这样呢?如何捕获此异常并从中恢复?

谢谢

Gar*_*ell 5

您是正确的,在声明它的连接时,排他队列将被删除;这意味着该连接仍处于打开状态,而您在日志中看到的连接并未声明该连接。

当系统处于这种状态时,请转到管理UI,您可以在其中浏览队列以及拥有该队列的连接。

例如 Exclusive owner 127.0.0.1:60113

如果显示关闭的连接(在上面的示例中为XX.XXX.57.1​​74:17959),则应与Rabbitmq-users谷歌组的rabbitmq成员联系,这似乎不是spring-amqp问题;

编辑

仅供参考,如果被动队列声明由于任何原因而失败,则默认情况下,使用者将以5秒的间隔尝试3次,然后放弃并停止容器。

容器上有两个属性可用于调整此属性- declarationRetriesfailedDeclarationRetryInterval(分别为默认值3和5000)。如果使用<rabbit:listener-container />配置,则名称空间上有等效的属性。