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

时间:2016-04-25 19:49:35

标签: c# rabbitmq amqp

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

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参数的假设是什么,它似乎都没有连接(我得到&#34;没有指定的端点可以到达&#34;)

即使我的列表只包含一个元素。

现在,如果我使用像这样的单个主机实现,它可以正常工作:

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

1 个答案:

答案 0 :(得分:2)

我认为您可能需要为连接工厂的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提供了一个RandomHostnameSelector

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

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