现象:
研发反应,生产者向指定的exchange中发送消息,但是解绑之后消息就不能发到指定的队列了。
原因:
生产者是作为守护进程运行的,只在首次启动的时候声明exchange,声明的时候会指定routingkey,但消费进程在连接rabbitmq的时候,也会声明exchange,但这个时候的声明没有指定routingkey的值为空,导致原来生产者声明的exchange的routingkey信息被覆盖了,出现的问题就是一个exchange的routingkey为空,却路由到多个queue导致当一个消息被推送到exchange之后,就不能确定该消息会被路由到哪个queue了,因为没有到指定的queue中,所以看起来就像是推送的消息丢失了。
解决办法:
消费进程改代码,现在把声明exchange的代码去掉。只监听queue,不去更改routing key。
排查过程:
1,确认生产者推送消息确实成功了,根据研发提供的日志可以确认这一点。
INFO com.shein.pss.utils.MqSender - [推送消息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功] 我们这边显示了以后,对方说这条消息没进 INFO com.shein.pss.utils.MqSender - [推送消息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功]
2,研发反应:有问题的队列是pss_checkAccount_checkResult_queue_pms_test
这个队列,我刚观察条一个信息,有一条消息 unack了 然后又ack了 之后就解绑了。
- 我把原来的队列都删了
- 重启了测试环境的生产者进程代码
- 发现并没有绑定空的routing key
但消费进程一启动,就有了空绑定,所以完全可以确定就是消费进程的代码问题。