2011-11-28 130 views
9

我有一個簡單的RabbitMQ測試程序隨機排隊消息,另一個讀取它們,全部使用Spring-AMQP。如果消費者死亡(例如,在沒有機會關閉其連接或通道的情況下殺死一個進程),則任何未被確認的消息似乎永遠都不會被確認。沒有連接的AMQP/RabbitMQ頻道何時死亡?

我見過很多參考文獻(例如this question),表示通道在沒有連接的情況下死亡,剩餘的未被刪除的消息將被重新發送。這不是我看到的行爲 - 相反,我獲得了越來越多的標記爲IDLE的頻道列表,以及越來越多的標記爲正在運行但沒有活動的連接列表。

是否有一些配置需要注意,一旦進程被終止,連接已經死亡?

編輯: 我在一個VirtualBox虛擬機內運行rabbitmq服務器,這顯然不能通過NAT正確管理死入站連接。這對於直接在物理主機上運行的mq服務器來說很好。

+1

FYI:我在這裏獨家隊列沒有被清理的經紀人及時專屬消費死後類似的問題。這阻止了具有確定性名稱的這些組件從開始。它是由ConnectionFactory.RequestedHeartbeat''設置爲較小的值(秒) – drstevens

回答

3

應答關閉。事實證明這不是一個真正的問題。

我運行一個虛擬機VirtualBox的,這顯然不正常了NAT管理死入站連接內的RabbitMQ服務器。這對於直接在物理主機上運行的mq服務器來說很好。

4

AMQP使用隊列和交換。你在交換機上發佈並且綁定隊列以從交易所獲得消息(你可以在我的博客上看到short explanation。當你創建一個隊列時,你可以將它設置爲自動刪除,以及在自動刪除之前它會保留多少時間。刪除 下面是來自RabbitMQ的quickref報價:

queue.declare(短保留-1,隊列名隊列,有點被動,位 耐用,有點​​排斥,位自動刪除,NO-等待不等待,表 自變量)➔declare-ok

支持:full聲明隊列,如果需要創建

此方法創建或檢查隊列。創建新隊列時,客戶端可以指定各種屬性,以控制隊列及其內容的持久性,以及隊列的共享級別。

RabbitMQ實現了AMQP規範的擴展,允許隊列的創建者 控制其行爲的各個方面。

每隊列消息TTL該擴展確定發佈到隊列的消息在被服務器丟棄之前可以存活多長時間。 使用此方法的參數 參數的x-message-ttl參數配置生存時間。

隊列到期隊列可以聲明一個可選的租約時間。租約時間決定了在服務器自動刪除 之前,隊列可以保持未使用狀態的時間。在該方法的參數參數中提供的租約時間爲 x-expires參數。

鏡像隊列我們已經爲 隊列開發了主動/主動高可用性。這可以通過允許隊列在RabbitMQ集羣中的其他節點 上鏡像來工作。結果是,如果羣集的一個節點發生故障,則隊列可以自動切換到其中一個鏡像 並繼續運行,而不會無法使用服務。要創建鏡像隊列 ,您需要在此方法的參數 參數中提供x-ha-policy參數。

+0

我不想隊列被刪除解決了,我希望它是持久的。但我也希望未確認的消息(由確認前死亡的進程消耗)被重新傳遞。這是需要刪除的死連接/通道,而不是消息。 –

+2

OK現在我把你 - 你需要創建ConnectionParameters實例和心跳(setRequestedHeardbeat)設置一個合理的值(1個心跳丟失將關閉該通道),然後傳遞給ConnectionFactory的構造 –

+0

@Arnon Rotem公司-Gal一盎司,創下'RequestedHeartbeat'解決了我這是在不能及時被清理的經紀人獨家隊列表現類似的問題。這阻止了從具有確定性名稱的獨佔隊列開始的組件。 – drstevens