C# 如何使用RabbitMQ主机列表连接参数

C# 如何使用RabbitMQ主机列表连接参数,c#,rabbitmq,amqp,C#,Rabbitmq,Amqp,在C#rabbitMQ库中创建连接时,我尝试使用IList参数: 我的代码如下: private IConnection CreateConnection() { var connectionFactory = new ConnectionFactory { UserName = _userName, Password = _password, VirtualHost = _

在C#rabbitMQ库中创建连接时,我尝试使用
IList
参数:

我的代码如下:

    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建议不要在客户机上存储主机集,但我只是想让它们提供的方法发挥作用。

我认为您可能需要为连接工厂的
HostnameSelector
属性设置一个值

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提供随机主机名称选择器

class RandomHostnameSelector : IHostnameSelector
{
    string IHostnameSelector.NextFrom(IList<string> options)
    {
        return options.RandomItem();
    }
}
class RandomHostnameSelector:IHostnameSelector
{
字符串IHostnameSelector.NextFrom(IList选项)
{
返回选项。RandomItem();
}
}

或者您可以创建自己的
IHostnameSelector
实现,以拥有自己的主机选择策略。

我在最新版本的RabbitMQ.NET库中没有此实现?@Matthew您使用的RabbitMQ客户端库版本是什么?请参阅@Matthew,ConnectionFactory的文档确实指出HostnameSelector仅在恢复连接时使用。您确定您的主机名在
IList hostnames
中有效吗?在我的测试中,我通过的一个主机无法访问。我的期望是连接和恢复将转移到另一台主机。例如,我可能知道集群中有多个节点。如果node1无法访问,我希望它尝试node2。另外,我使用的是3.6.1。您指出的类不是公开的,而是内部的。不过没问题,我可以自己创造。它没有解决我的问题:(奇怪,因为根据最新的
connectionFactory.CreateConnection();
调用
CreateConnection(new List(){HostName},null);
是。如果我发送一个项目列表,它就可以工作。也许我的测试方法不正确。我理解这种方法是为了不断尝试通过列表中的所有成员查找节点。