背景
项目同时连接多个rabbitmq,使用spring-rabbit进行连接,版本号为1.4.6.RELEASE
某天发现rabbitmq服务器日志错误日志出现大量
Channel error on connection <0.3019.46> (1.1.1.1:41724 -> 1.2.3.4:5672, vhost: ‘/‘, user: ‘xunhuan_prod’), channel 31: operation queue.declare caused a channel exception not_found: “no queue ‘wolfkill.groups.online.time.queue’ in vhost ‘/‘“
rabbitmq架构
两个rabbitmq集群,使用不同的virtual host
集群 | Virtual Host | Queue |
---|---|---|
A | service_A | A1, A2 |
B | / | wolfkill.groups.online.time.queue |
故障排查
检查spring xml配置文件
- 两个rabbitmq配置都已经分开
- queue和exchange都全部加上了declared-by
检查源代码
SimpleMessageListenerContainer
初始化的时候判断当前RabbitAdmin的数量,假如不为空的话,就赋值给成员变量RabbitAdmin,看到这里时已经感觉有点不妥,这也太过随意了吧😮,该项目接入了两个mq,所以RabbitAdmin对应着有两个。
源代码传送门
1 |
|
在doStart之后执行的代码,拿了不确定的RabbitAdmin继续declare Queue(调用Rabbitmq Broker api).
源代码传送门
1 | private synchronized void redeclareElementsIfNecessary() { |
检查新版本代码
检查最新的版本1.7.3.RELEASE, 最新版本已经加了条件判断,当只有一个RabbitAdmin时才会设置。
1 |
|
所以该问题的原因是spring rabbitmq在项目同时存在多个RabbitAdmin时,误用了RabbitAdmin, RabbitAdmin就是分别对应着不同的Rabbitmq集群,在该场景下,用了RabbitAdmin A去创建原本应该创建在B上的Virtual Host为“/”的Queue”wolfkill.groups.online.time.queue”.
总结
- 该问题是spring-rabbitmq模块的bug,搞版本已经解决
- 使用开源工具时,尽可能的使用最新的版本。