我在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建议不要在客户端上存储这些主机,但我只是想让他们提供的方法起作用。
答案 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
实现,以拥有自己的主机选择策略。