2013-03-09 50 views
7

我發現這個寶石:自動重新連接的RabbitMQ渠道

連接失敗的情況下,客戶將需要建立與代理的新連接。上一個連接上打開的任何頻道都將自動關閉,這些頻道也需要重新打開。

所以這並不好。我即將編寫一個處理自動重新連接和重新創建通道的大圖層,然後將所有代碼封裝起來。問題是,這應該已經完成​​了。這在Java RMQ庫中可能嗎?

+0

我不確定我是否遵循這裏關於渠道的問題。他們就像連接精簡版。所以如果你斷開連接,你也會失去你的頻道。 – robthewolf 2013-03-11 11:06:19

+0

你有沒有想過這個?或者你是否編寫了自動重新連接層?你有機會分享它嗎? – StFS 2013-07-16 16:25:51

+0

@StFS我寫了一個*非常* kludgey重新連接層。對於我來說,在這一點上開源並不是那麼容易,但我很樂意提供建議 - 向程序員發佈一個問題。尋求設計這一層的幫助,我會回覆。 – djechlin 2013-07-16 16:32:16

回答

1

是的,我同意這是當前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的(或任何其他消息)庫交互的一種全新的方式。當我在這方面做了一些工作時,我會告訴你,可能要幾個月。

+0

你說你會讓我們知道。這是否發生過? – 2015-09-16 14:10:52

6

結賬Lyra:高可用性RabbitMQ客戶端在意外關閉時自動恢復資源(連接/通道/使用者)。

+0

它可以像消費者目前消費一樣保持狀態嗎? – djechlin 2013-10-24 21:36:27

+0

@djechlin絕對 - 任何目前消費的消費者都被追回。 – Jonathan 2014-04-03 00:23:01

2

RabbitMQ 3.3.0(2014年4月)開始,這對Java客戶端來說是可能的。

此版本。 。 。允許基於Java的客戶端在網絡故障後自動重新連接。

我不知道這是否是僅服務器更改,僅對客戶端庫進行了更改才使此成爲可能,等等。仍在研究。

6

也許這是RabbitMQ的客戶端的新功能,但我發現這在他們的文檔:

要啓用自動連接恢復,使用 factory.setAutomaticRecoveryEnabled(真):

https://www.rabbitmq.com/api-guide.html

看起來應該可以解決問題。