2016-06-09 47 views
1

使用的RabbitMQ與節點的集羣的主機,我建立了我廠與這樣的連接(使用.NET客戶端):怎麼看我們連接到

var factory = new ConnectionFactory() 
{ 
    UserName = Properties.Settings.Default.RabbitMQUser, 
    Password = Properties.Settings.Default.RabbitMQPassword, 
    HostnameSelector = new RandomHostNameSelector(), 
    AutomaticRecoveryEnabled = true 
}; 
connection = factory.CreateConnection(Properties.Settings.Default.RabbitMQServers.Split(';')); 

哪裏Properties.Settings.Default.RabbitMQServers是使用半冒號分隔的服務器列表:

clust01;clust02;clust03 

連接後,有沒有辦法看到主機實際上採摘,是有辦法來檢測時可能會改變(因爲特定節點崩潰,停止,或重新啓動)? factory.HostName只是返回localhost

編輯:看來connection.Endpoint.HostName確實給你實際的主機名@Evk和@wally都有說明(謝謝)。但是有沒有辦法檢測到變化?看起來IConnection有一個ConnectionShutdown事件,其中我猜可能被稱爲切換主機的一部分,但沒有相應的啓動或重新啓動事件(所以我假設它不會知道新的主機) 。也有ConnectionBlockedConnectionUnblocked事件,但他們沒有記錄,所以我不知道他們在做什麼...

+2

我想connection.Endpoint.HostName包含你想要的? – Evk

+0

@Evk - 當我輸入自己的回覆時發佈。我認爲你有正確的答案 - 但我無法測試它。 – wally

回答

2

那麼如何獲取主機名,你已經發現了,作爲如何檢測它何時發生變化:當您爲您的工廠設置AutomaticRecoveryEnabled時,CreateConnection將真正返回AutorecoveringConnection的實例。這個類實現了特殊的IRecoverable接口,它有你需要的事件。因此,要檢測自動恢復發生時,訂閱它是這樣的:

var connection = factory.CreateConnection(); 
((IRecoverable)connection).Recovery += (sender, args) => 
{ 
    // recovery happened 
}; 
+0

好東西 - 是的,似乎工作。奇怪的是,它似乎並沒有實際上第一次調用選擇器。它總是連接到我的主機列表中的最後一個節點。但是,當我將該節點放下時,似乎可以連接到其他節點並更新主機名。 –

+0

@MattBurland是的,如果查看源代碼,它僅使用HostnameSelector進行常規(不可恢復)連接。爲了可恢復,它總是選擇最後一個。你可以實現你自己的隨機選擇邏輯,也可以把首選主機名放在最後。 – Evk

1

我還沒有一個可以測試的環境,所以它可能是完全錯誤的。

看起來像您可以使用connection對象的endpointIConnection)返回:

(string) connection.Endpoint.HostName 

引用:https://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.4.0/rabbitmq-dotnet-client-1.4.0-net-2.0-htmldoc/type-RabbitMQ.Client.IConnection.html

+0

這對於獲取主機名是正確的,但有沒有辦法檢測它是否以及何時發生變化? –

+0

我不知道RabbitMQ(我曾在PHP和Python中使用它,並且只是最近C#)「官方」庫執行任何此類故障切換。 我希望它被記錄,如果它(並且我不能看到我期望它的位置:https://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.2 /rabbitmq-dotnet-client-3.6.2-client-htmldoc/html/type-RabbitMQ.Client.IHostnameSelector.html) – wally

相關問題