Полли WaitAndRetry с окончательным исключением ничего не делает - PullRequest
0 голосов
/ 23 ноября 2018

Я выполняю вызовы во внешнюю службу, которая не очень стабильна, и, таким образом, выдает WebExceptions.
Я хочу повторить попытку несколько раз, а после последней попытки хочу выбросить последнюю полученную ошибку.

Это моя попытка с Полли (v6.1.1) :

public static Policy WaitAndRetryPolicy<T>(short nrOfRetryAttempts = 5) where T : Exception
{
    var waitAndRetry = Policy
        .Handle<T>()
        .WaitAndRetry(nrOfRetryAttempts, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

    var fallbackForLastError = Policy
        .Handle<T>()
        .Fallback(
            fallbackAction: () => { },
            onFallback: (ex) => { throw ex; });

    return Policy.Wrap(fallbackForLastError, waitAndRetry);
}

Вызывающий, устаревший VB.Net:

Dim retryPolicy = Policies.WaitAndRetryPolicy(Of WebException)()
Dim theResult = retryPolicy.
    ExecuteAndCapture(Function()
                          Return aProxy.GetSomething(a, b)
                      End Function).Result

Когда я запускаю код каккак показано выше, theResult остается нулевым, и, похоже, служба не вызывается.Если я просто использую WaitAndRetryPolicy без функции Fallback , служба вызывается, и механизм повторных попыток работает как положено (без исключения, конечно, без исключения).

Как мне достичь своей цели,без проверки PolicyResult.FinalException в коде вызывающего абонента?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Чтобы Полли повторно сгенерировала любое окончательное исключение, а не захватило его в PolicyResult.FinalException, просто выполните политику с перегрузками .Execute(...) или .ExecuteAsync(...), а не .ExecuteAndCapture(...) или .ExecuteAndCaptureAsync(...)

0 голосов
/ 23 ноября 2018

Я не знаю о последнем исключении, но я реализовал очень похожее поведение с Retry и CircuitBreakerException (с Wrapping).Таким образом, вы можете попробовать 3 раза и сгенерировать аварийное прерывание после 2 сбоев.Тогда вы сможете отреагировать на последнее исключение.

Policy
.Handle<SomeExceptionType>()
.CircuitBreaker(2, TimeSpan.FromMinutes(x));
...