У меня есть следующий код для подключения, чтобы создать канал. Имейте в виду, что это синглтон для всего приложения:
Код: Выделить всё
public class RabbitMQConnection : IDisposable
{
private readonly ConnectionFactory _connectionFactory;
private readonly object _lock;
private readonly IList _endpoints;
private bool _shouldClose = false;
private IConnection Connection { get; set; }
public RabbitMQConnection(IEnumerable hostList, string username, string password)
{
_endpoints = hostList.Select(s =>
{
var split = s.Split(':');
var hostname = split[0];
int port = -1;
if (split.Length > 1 && int.TryParse(split[1], out int parsedPort))
port = parsedPort;
return new AmqpTcpEndpoint(hostname, port);
}).ToList();
_connectionFactory = new ConnectionFactory
{
UserName = username,
Password = password,
AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds(5),
};
_lock = new object();
}
~RabbitMQConnection() => Dispose();
private void StartConnection()
{
if (_shouldClose)
return;
lock (_lock)
{
if (Connection?.IsOpen == true)
return;
if (Connection != null)
Connection.Dispose();
Connection = _connectionFactory.CreateConnection(_endpoints);
Connection.ConnectionShutdown += Connection_ConnectionShutdown;
}
}
private void Connection_ConnectionShutdown(object sender, ShutdownEventArgs e) => StartConnection();
public void Dispose()
{
_shouldClose = true;
lock (_lock)
{
if (Connection != null)
{
if (Connection.IsOpen)
Connection.Close();
Connection.Dispose();
Connection = null;
}
}
}
public IModel CreateChannel()
{
StartConnection();
return this.Connection.CreateModel();
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... than-usual
Мобильная версия