RabbitMQ - Как смоделировать время ожидания соединения для тестирования реализации Polly - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь реализовать функциональность «ждать и повторить» для клиента RabbitMQ с использованием Polly. В настоящее время я знаю, что моя реализация не верна (см. Ниже), но действительно трудно реализовать ее правильно, потому что я не знаю, как имитировать тайм-аут соединения или некоторые другие ошибки, связанные с сетью ...

Так что мне нужен ответ хотя бы на один из моих вопросов:)

  • Есть ли способ имитировать время ожидания соединения для RabbitMQ?

  • Как правильно реализовать Polly для RabbitMQ?

Я использую сетевой клиент 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)

Спасибо.

...