あまり安定していない外部サービスへの呼び出しを実行すると、WebExceptions がスローされます。
数回再試行したいのですが、最後の試行の後、最後に受信したエラーをスローしたいと考えています。
これはPolly (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が null のままになり、サービスが呼び出されないように見えます。Fallback関数を使用せずに WaitAndRetryPolicy を使用すると、サービスが呼び出され、再試行メカニズムが期待どおりに機能します (もちろん例外はスローされません)。
呼び出し元コードでPolicyResult.FinalExceptionをチェックせずに、どうすれば目標を達成できますか?