2016-04-25 20 views
3

我試圖創建在C#的RabbitMQ庫連接時使用IList<string>參數:如何使用主機連接參數的RabbitMQ的名單

IConnection CreateConnection(IList hostnames)

我的代碼如下:

private IConnection CreateConnection() 
    { 
     var connectionFactory = new ConnectionFactory 
     { 
      UserName = _userName, 
      Password = _password, 
      VirtualHost = _vhost, 
      AutomaticRecoveryEnabled = DEFAULT_AUTO_RECOVER, 
      RequestedHeartbeat = HEARTBEAT_TIMEOUT_SECONDS, 
      Port = AmqpTcpEndpoint.UseDefaultPort, 
     }; 
     // _hosts contains valid IPs "###.###.###.###" 
     return connectionFactory.CreateConnection(_hosts); 
    } 

但無論我想爲hosts參數它似乎並沒有連接(我得到「沒有指定的終點可達」)

即使我的列表只包含一個元素。現在

,如果我使用主機實現這樣的,它工作正常:

private IConnection CreateConnection() 
    { 
     var connectionFactory = new ConnectionFactory 
     { 
      UserName = _userName, 
      Password = _password, 
      VirtualHost = _vhost, 
      AutomaticRecoveryEnabled = DEFAULT_AUTO_RECOVER, 
      RequestedHeartbeat = HEARTBEAT_TIMEOUT_SECONDS, 
      Port = AmqpTcpEndpoint.UseDefaultPort, 
      HostName = _hosts.First() // or just one string 
     }; 
     return connectionFactory.CreateConnection(); 
    } 

我承認,RabbitMQ的建議不保存設置客戶端的主機,但我只是想讓他們提供的方法工作。

+0

奇怪,因爲根據最新的[source](https://github.com/rabbitmq/rabbitmq-dotnet-client/blob/e8f0a3aca3ab16ca3f2537dbc78543c91ff58f92/projects/client/RabbitMQ.Client/src/client/api/ConnectionFactory。 cs#L349)'connectionFactory.CreateConnection();'calls'CreateConnection(new List (){HostName},null);' –

+0

是的。如果我發送一個項目的清單,它的作品。也許我的測試方法是不正確的。我瞭解這種方法,試圖通過列表中的所有成員來查找節點。 – Matthew

回答

2

我想你可能需要爲連接工廠

private IConnection CreateConnection() 
{ 
    var connectionFactory = new ConnectionFactory 
    { 
     UserName = _userName, 
     Password = _password, 
     VirtualHost = _vhost, 
     AutomaticRecoveryEnabled = DEFAULT_AUTO_RECOVER, 
     RequestedHeartbeat = HEARTBEAT_TIMEOUT_SECONDS, 
     Port = AmqpTcpEndpoint.UseDefaultPort, 
     HostnameSelector = new RandomHostnameSelector() 
    }; 
    // _hosts contains valid IPs "###.###.###.###" 
    return connectionFactory.CreateConnection(_hosts); 
} 

的RabbitMQ提供了RandomHostnameSelector

class RandomHostnameSelector : IHostnameSelector 
{ 
    string IHostnameSelector.NextFrom(IList<string> options) 
    { 
     return options.RandomItem(); 
    } 
} 

或者你可以創建自己的實現的IHostnameSelector擁有的HostnameSelector屬性設置的值您自己的主機選擇策略。

+0

我沒有在最新版本的RabbitMQ .NET庫中實現這個功能嗎? – Matthew

+0

這段代碼適合你嗎? – Matthew

+0

@Matthew您使用的是什麼版本的RabbitMQ客戶端庫?參見[docs for v3.6.0](https://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.0/rabbitmq-dotnet-client-3.6.0-client-htmldoc/html/type-RabbitMQ .Client.ConnectionFactory.html) –

相關問題