Я пытаюсь реализовать функциональность «ждать и повторить» для клиента RabbitMQ с использованием Polly. В настоящее время я знаю, что моя реализация не верна (см. Ниже), но действительно трудно реализовать ее правильно, потому что я не знаю, как имитировать тайм-аут соединения или некоторые другие ошибки, связанные с сетью ...
Так что мне нужен ответ хотя бы на один из моих вопросов:)
Я использую сетевой клиент RabbitMQ: https://www.rabbitmq.com/dotnet.html
Моя текущая реализация выглядит примерно так (псевдокод):
private readonly IConnectionFactory _factory;
private IConnection _connection;
private IModel _channel;
public void Publish(...)
{
var policy = Policy.Handle<Exception>().WaitAndRetry(...);
policy.Execute(() =>
{
var channel = GetChannel();
channel.BasicPublish(...);
});
}
private IConnection GetConnection()
{
if (_connection != null && _connection.IsOpen)
return _connection;
_connection?.Dispose();
_connection = _factory.CreateConnection();
return _connection;
}
private IModel GetChannel()
{
if (_channel != null && _channel.IsOpen && !_channel.IsClosed)
return _channel;
_channel?.Dispose();
var connection = GetConnection();
_channel = connection.CreateModel();
return _channel;
}
В настоящее время, когда я получаю тайм-аут (который не моделируется), Полли определяет его правильно. Сообщение об исключении:
Unable to write data to the transport connection: Connection timed out. (source: System.Net.Sockets, type: IOException)
И когда он пытается выполнить попытку, я получаю новое исключение:
Unable to write data to the transport connection: Operation canceled. (source: System.Net.Sockets, type: IOException)
Спасибо.