1. 程式人生 > >rabbitmq exchange與queue莫名其妙解綁

rabbitmq exchange與queue莫名其妙解綁

現象: 研發反應,生產者向指定的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

但消費程序一啟動,就有了空繫結,所以完全可以確定就是消費程序的程式碼問題。