Full source code here.
I recently presented a talk on Polly at the DevUp conference in St. Louis. In the presentation I showed examples using Polly with HttpClient requests only because this is my most common use case. I showed how to use retries, circuit breakers, fallbacks, caching, timeouts and bulkheads isolation. At the end of the presentation a few people asked me if Polly could be used with other types of request, of course it can and I should have said so during the talk. I’ve added new slide for the next time I present on Polly – (as of October 2018 that will be Granite State Code Camp, Boston Code Camp and NDC London).
Polly can be used with any type of request you make, whether it returns a value or not. You can use on code that throws exceptions from time to time (though I strongly recommend fixing your code), for database calls, any method call for that matter. Below are some examples of using the retry policy in a variety of scenarios.
Exceptions
This policy retries if an exception is thrown, you can be more specific about exception types.
RetryPolicy retryIfException = Policy.Handle<Exception>() .Retry(4, (exception, retryCount) => { Console.WriteLine($"Got a response of {exception.Message} (expected 0), retrying {retryCount}"); });
Int
Here I check check if the int
returned is anything other than 0, or if there has been a DivideByZeroException
. If so, I retry up to four times and also print some text to console.
RetryPolicy<int> retryPolicyNeedsAResponseOfOne = Policy.HandleResult<int>(i => i != 0) .Or<DivideByZeroException>() .Retry(4, (response, retryCount) => { Console.WriteLine($"Got a response of {response.Result} (expected 0), retrying {retryCount}"); });
IEnumerable
In this one I check that the IEnumerable
has three items in it, if not, I retry and print some info to the console.
RetryPolicy<IEnumerable<int>> retryPolicyNeedsResponeWithTwoNumbers = Policy.HandleResult<IEnumerable<int>>(l => l.Count() != 3) .Retry(4, (response, retryCount) => { Console.WriteLine($"Got a reponse with {response.Result.Count()} entries (expected 3), retrying {retryCount}"); });
Bool
In this policy I check the bool
returned, if it is false, I retry.
RetryPolicy<bool> retryPolicyNeedsTrueResponse = Policy.HandleResult<bool>(b => b != true) .Retry(4, (response, retryCount) => { Console.WriteLine($"Got a reponse of {response.Result} entries (expected true), retrying {retryCount}"); });
Polly can check the value of any return type or exception making it possible to use Polly for any call you can think of.
Full source code here.