-
Notifications
You must be signed in to change notification settings - Fork 0
/
CircuitBreakerPolicyHandler.cs
57 lines (50 loc) · 2.02 KB
/
CircuitBreakerPolicyHandler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Polly;
namespace Bede.RefitTest
{
public class CircuitBreakerPolicyHandler : DelegatingHandler
{
private readonly LoggingSettings _loggingSettings;
private readonly bool _circuitBreakerEnabled;
private readonly Policy _circuitBreaker;
public CircuitBreakerPolicyHandler(LoggingSettings loggingSettings, CircuitBreakerSettings settings, HttpMessageHandler inner)
: base(inner)
{
_loggingSettings = loggingSettings;
_circuitBreakerEnabled = settings.CircuitBreakerEnabled;
_circuitBreaker = Policy
.Handle<Exception>()
.CircuitBreakerAsync(settings.ExceptionAllowedBeforeCircuitBroken, TimeSpan.FromMilliseconds(settings.DurationOfCircuitBreakMiliseconds));
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
HttpResponseMessage responseMessage;
if (_circuitBreakerEnabled)
{
responseMessage = await _circuitBreaker.ExecuteAsync(async () =>
{
_loggingSettings.LogInformation(LogCategories.CircuitBreaker, "Circuit breaker handler calling " + request.RequestUri);
try
{
return await base.SendAsync(request, cancellationToken);
}
catch (Exception ex)
{
_loggingSettings.LogError(LogCategories.CircuitBreaker, ex,
"Circuit breaker caught exception");
throw;
}
});
}
else
{
responseMessage = await base.SendAsync(request, cancellationToken);
}
return responseMessage;
}
}
}