2013-03-20 60 views
1

我有一些客戶端通過autodelete:yes連接到交換機。這些都是出版商和消費者。但基本上現在讓我們假設他們正在發佈消息。因爲每個客戶端都有唯一的綁定密鑰,所以我可以在使用這些計算機的計算機上的每條消息上做明確的內容。一切正常。當在rabbitmq上刪除隊列時通知消費者

現在,如果客戶端崩潰或我手動終止它(通過SIGINT,ctrl + c),然後隊列被刪除。有什麼方法可以通知遠程機器上的用戶隊列被刪除嗎?

我正在考慮在我的客戶端應用程序上創建一個信號處理程序,因此無論何時我會捕獲一個SIGINT或SIGTERM,然後我會通知遠程使用者(我會向他們發送一條消息, ID將被刪除)

有沒有其他的方式來做到這一點,或者是我的方式做到這一點的正確方法?

+0

能否請你澄清?當一個隊列被刪除時,消費者隨之被刪除(並且伴隨的通道被關閉)。因此,不應該有消費者通知。 – theMayer 2013-03-20 18:43:14

+0

我會澄清內容。基本上對於消費者來說,我的意思是一臺遠程機器,它正在從我的客戶正在發佈的交換機中消費。 – 2013-03-20 22:09:53

+0

您正在使用扇出或主題交換?我想你可能想提供一個顯示你的拓撲結構的圖表,因爲誰發佈到哪裏以及誰在哪裏消費,並不是很清楚。 – theMayer 2013-03-20 23:11:55

回答

1

如消息一般來說,消費應用程序不關心生產應用程序的狀態。

在RabbitMQ中,通過兩種機制之一產生應用程序可能會意識到消費應用程序的狀態。第一種(也是首選)方法是通過Dead-Letter Exchange (dlx)。當您的消息無法傳遞時(因爲目標隊列不存在),它將在此處路由,並且您的應用程序可以將消息從DLX上配置的隊列中取出,以確定它們是否未到達目的地。

第二種方法是在消息上設置Mandatory標誌。如果目標隊列不在那裏,這將導致代理通過Basic.Return方法將消息直接發送回生產應用程序。

如果上述項目不能滿足您的需求,您可能需要重新審視您的體系結構,因爲可能有更好的方法來設計您的應用程序。

+0

立即消息有意義。感謝您的注意。我會嘗試一下並用我的結果評論回來。 – 2013-03-20 23:23:48

+0

我的不好,我的意思是寫強制性的。 – theMayer 2013-03-20 23:30:36

相關問題