Polly Retry не работает, и журналы для повтора не добавляются

В настоящее время у меня есть код, в котором цикл while застревает при подключении. IsConnected = true

private  bool TryConnect()
    {
        if (!connection.IsConnected)
        {
            Monitor.Enter(_syncRoot);
            try
            {
                while (!connection.IsConnected)
                {
                    Thread.Sleep(100);
                }
            }
            finally
            {
                Monitor.Exit(_syncRoot);
            }
        }
        return true;
    }

Поэтому для этого я попытался заменить это на Polly retry, но с Polly он не ждет, и журнал не добавляется.

private  bool TryConnect()
    {
        if (!connection.IsConnected)
        {
            Monitor.Enter(_syncRoot);
            try
            {
                var policy = Policy.HandleResult<bool>(r => r == false)
                    .WaitAndRetry(_retryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
                        (ex, time) =>
                        {
                            Log.LogInformation(
                                "retry {TimeOut}s");
                        }
                    );
                policy.Execute(() => connection.IsConnected);
            }
            finally
            {
                Monitor.Exit(_syncRoot);
            }
        }
        return true;
    }

Если кто-то может сообщить мне, что я делаю не так с кодом. Это будет действительно полезно


person finn    schedule 19.05.2020    source источник
comment
Это не ожидание / повторная попытка, потому что connection.IsConnection не сбой. Скорее всего, вы захотите использовать polly на более высоком уровне - например, обернуть вызов, который использует TryConnect. Также возможно, что ваши застрявшие проблемы связаны с блокировкой и используются из нескольких потоков, которые все еще присутствуют в приведенном выше коде.   -  person MikeJ    schedule 19.05.2020


Ответы (1)


Из опубликованного вами кода трудно угадать, какой драйвер C # вы используете для подключения к RabbitMq. Итак, я не смогу помочь вам с кодом конкретного драйвера.

Но, как я вижу, IsConnected объекта подключения - это свойство. Это означает, что это общедоступная поверхность, которую можно использовать для проверки состояния нижележащего объекта. Другими словами, это не должно вызывать изменение состояния только потому, что вы несколько раз извлекаете внутреннее состояние.

Логика повтора должна быть сосредоточена на самом действии, которое отвечает за подключение к вашему экземпляру RabbitMq.

retryPolicy.Execute(() => connection.Open());

Кстати, ваш код никогда не возвращается с false. Это либо успех, либо сбой с некоторым исключением, связанным с тайм-аутом.

person Peter Csala    schedule 02.06.2020