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.174: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.174:17959-> 192.168.100.145:5671):connection_closed_abruptly
=信息报告==== 2016年4月12日:: 15:13:41 ===接受AMQP连接<0.6899.0>(XX.XXX.57.174:51716-> 192.168.100.145:5671)
我无法重现它(我曾尝试关闭Rabbitmq的连接并拔下网络电缆,但应用程序再次重新连接良好),所以我不知道为什么会这样。假设在连接关闭时删除了专用队列和专用队列,为什么会这样呢?如何捕获此异常并从中恢复?
谢谢
您是正确的,在声明它的连接时,排他队列将被删除;这意味着该连接仍处于打开状态,而您在日志中看到的连接并未声明该连接。
当系统处于这种状态时,请转到管理UI,您可以在其中浏览队列以及拥有该队列的连接。
例如 Exclusive owner 127.0.0.1:60113
如果显示关闭的连接(在上面的示例中为XX.XXX.57.174:17959),则应与Rabbitmq-users谷歌组的rabbitmq成员联系,这似乎不是spring-amqp问题;
编辑
仅供参考,如果被动队列声明由于任何原因而失败,则默认情况下,使用者将以5秒的间隔尝试3次,然后放弃并停止容器。
容器上有两个属性可用于调整此属性- declarationRetries和failedDeclarationRetryInterval(分别为默认值3和5000)。如果使用<rabbit:listener-container />配置,则名称空间上有等效的属性。
| 归档时间: |
|
| 查看次数: |
6900 次 |
| 最近记录: |