我有一个像这样定义的匿名和独占队列:
@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.174: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.174:17959 - > 192.168.100.145:5671): connection_closed_abruptly
= INFO REPORT ==== 2016年4月12日:: 15:13:41 ===接受AMQP连接< 0.6899.0> (XX.XXX.57.174:51716 - > 192.168.100.145:5671)
我无法重现它(我已尝试关闭rabbitmq的连接并移除网络电缆,但应用程序重新连接良好),所以我不知道为什么会发生这种情况。 假设关闭连接时会删除私有和独占队列,为什么会发生这种情况?如何捕获此异常并从中恢复?
由于
答案 0 :(得分:4)
您是正确的,在声明它的连接时会删除独占队列;这意味着该连接仍处于打开状态,并且您没有在日志中看到的连接声明它。
当您的系统处于这种情况时,请转到管理界面,您可以在其中浏览队列以及哪个连接拥有该队列。
e.g。 Exclusive owner 127.0.0.1:60113
如果显示已关闭的连接(上例中的XX.XXX.57.174:17959),您应该联系rabbitmq-users google组中的rabbitmq人员,这似乎不是spring-amqp问题;
修改强>
仅供参考,如果被动队列声明因任何原因失败,默认情况下,消费者将以5秒的间隔尝试3次,然后放弃并停止容器。
容器上有两个可用于调整此属性的属性 - declarationRetries
和failedDeclarationRetryInterval
(分别默认为3和5000)。如果使用<rabbit:listener-container />
配置,则命名空间中存在等效属性。
答案 1 :(得分:0)
检查队列名称不应与交换绑定,否则您将收到此错误。或者我认为队列名称已经存在。