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

时间:2016-04-14 11:11:02

标签: 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();
    }

有时我得到这个错误en rabbitmq log:

  

=错误报告==== 2016年4月12日:: 15:13:42 ===连接时的通道错误< 0.6899.0> (XX.XXX.57.1​​74:51716 - > 192.168.100.145:5671,   vhost:' /',用户:' XXXX_USER'),频道1:   {amqp_error,resource_locked,               "无法获得对锁定队列的独占访问权限#39; XXXX_USER-宽1457bb43-6487-4252-b21a-a5a92d19e0dc'在vhost' /'"中,               ' queue.declare'}

因此客户端无法声明队列,也无法从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

     

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

我无法重现它(我已尝试关闭rabbitmq的连接并移除网络电缆,但应用程序重新连接良好),所以我不知道为什么会发生这种情况。 假设关闭连接时会删除私有和独占队列,为什么会发生这种情况?如何捕获此异常并从中恢复?

由于

2 个答案:

答案 0 :(得分:4)

您是正确的,在声明它的连接时会删除独占队列;这意味着该连接仍处于打开状态,并且您没有在日志中看到的连接声明它。

当您的系统处于这种情况时,请转到管理界面,您可以在其中浏览队列以及哪个连接拥有该队列。

e.g。 Exclusive owner 127.0.0.1:60113

如果显示已关闭的连接(上例中的XX.XXX.57.1​​74:17959),您应该联系rabbitmq-users google组中的rabbitmq人员,这似乎不是spring-amqp问题;

修改

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

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

答案 1 :(得分:0)

检查队列名称不应与交换绑定,否则您将收到此错误。或者我认为队列名称已经存在。