我發現這個寶石:自動重新連接的RabbitMQ渠道
連接失敗的情況下,客戶將需要建立與代理的新連接。上一個連接上打開的任何頻道都將自動關閉,這些頻道也需要重新打開。
所以這並不好。我即將編寫一個處理自動重新連接和重新創建通道的大圖層,然後將所有代碼封裝起來。問題是,這應該已經完成了。這在Java RMQ庫中可能嗎?
我發現這個寶石:自動重新連接的RabbitMQ渠道
連接失敗的情況下,客戶將需要建立與代理的新連接。上一個連接上打開的任何頻道都將自動關閉,這些頻道也需要重新打開。
所以這並不好。我即將編寫一個處理自動重新連接和重新創建通道的大圖層,然後將所有代碼封裝起來。問題是,這應該已經完成了。這在Java RMQ庫中可能嗎?
是的,我同意這是當前RabbitMQ客戶端實現的主要缺點。我一直在使用RMQ大約2年(.NET庫),並且在那個時候沒有太多改變。它需要從頭開始完全重新編寫,而我還沒有時間去做。
但我確實有一些指針。首先,我將爲連接/通道對象創建一個包裝類(您需要通道執行AMQP操作,連接的唯一用途是創建通道)。然後,你的包裝類可以跟蹤通道或連接是否打開,並相應地採取行動。
我的代碼最終看起來像這樣:
while (_iNeedToBeSendingAndReceiving) {
try {
//This blocks indefinitely while waiting for a connection.
using (var channel = ConnectionWrapper.CreateChannel(string connectionString) {
//Do stuff, blah, blah
//When the connection or channel closes, an exception is thrown and
//I move to the catch block.
}
catch(ConnectionInterruptException ex) {
//Eat, yummy!
}
}
我的最終計劃是抽象的,即使這個東西了,然後創建一個與RabbitMQ的(或任何其他消息)庫交互的一種全新的方式。當我在這方面做了一些工作時,我會告訴你,可能要幾個月。
你說你會讓我們知道。這是否發生過? – 2015-09-16 14:10:52
從RabbitMQ 3.3.0(2014年4月)開始,這對Java客戶端來說是可能的。
此版本。 。 。允許基於Java的客戶端在網絡故障後自動重新連接。
我不知道這是否是僅服務器更改,僅對客戶端庫進行了更改才使此成爲可能,等等。仍在研究。
也許這是RabbitMQ的客戶端的新功能,但我發現這在他們的文檔:
要啓用自動連接恢復,使用 factory.setAutomaticRecoveryEnabled(真):
https://www.rabbitmq.com/api-guide.html
看起來應該可以解決問題。
我不確定我是否遵循這裏關於渠道的問題。他們就像連接精簡版。所以如果你斷開連接,你也會失去你的頻道。 – robthewolf 2013-03-11 11:06:19
你有沒有想過這個?或者你是否編寫了自動重新連接層?你有機會分享它嗎? – StFS 2013-07-16 16:25:51
@StFS我寫了一個*非常* kludgey重新連接層。對於我來說,在這一點上開源並不是那麼容易,但我很樂意提供建議 - 向程序員發佈一個問題。尋求設計這一層的幫助,我會回覆。 – djechlin 2013-07-16 16:32:16