AdvancedCircuitBreakerSyntaxAsync
Fluent API for defining a Circuit Breaker Policy.
using Polly.CircuitBreaker;
using Polly.Utilities;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly
{
public static class AdvancedCircuitBreakerSyntaxAsync
{
public static CircuitBreakerPolicy AdvancedCircuitBreakerAsync(this PolicyBuilder policyBuilder, double failureThreshold, TimeSpan samplingDuration, int minimumThroughput, TimeSpan durationOfBreak)
{
Action<Exception, TimeSpan> onBreak = delegate {
};
Action onReset = delegate {
};
return policyBuilder.AdvancedCircuitBreakerAsync(failureThreshold, samplingDuration, minimumThroughput, durationOfBreak, onBreak, onReset);
}
public static CircuitBreakerPolicy AdvancedCircuitBreakerAsync(this PolicyBuilder policyBuilder, double failureThreshold, TimeSpan samplingDuration, int minimumThroughput, TimeSpan durationOfBreak, Action<Exception, TimeSpan> onBreak, Action onReset)
{
return policyBuilder.AdvancedCircuitBreakerAsync(failureThreshold, samplingDuration, minimumThroughput, durationOfBreak, delegate(Exception exception, TimeSpan timespan, Context context) {
onBreak(exception, timespan);
}, delegate {
onReset();
});
}
public static CircuitBreakerPolicy AdvancedCircuitBreakerAsync(this PolicyBuilder policyBuilder, double failureThreshold, TimeSpan samplingDuration, int minimumThroughput, TimeSpan durationOfBreak, Action<Exception, TimeSpan, Context> onBreak, Action<Context> onReset)
{
Action onHalfOpen = delegate {
};
return policyBuilder.AdvancedCircuitBreakerAsync(failureThreshold, samplingDuration, minimumThroughput, durationOfBreak, onBreak, onReset, onHalfOpen);
}
public static CircuitBreakerPolicy AdvancedCircuitBreakerAsync(this PolicyBuilder policyBuilder, double failureThreshold, TimeSpan samplingDuration, int minimumThroughput, TimeSpan durationOfBreak, Action<Exception, TimeSpan> onBreak, Action onReset, Action onHalfOpen)
{
return policyBuilder.AdvancedCircuitBreakerAsync(failureThreshold, samplingDuration, minimumThroughput, durationOfBreak, delegate(Exception exception, TimeSpan timespan, Context context) {
onBreak(exception, timespan);
}, delegate {
onReset();
}, onHalfOpen);
}
public static CircuitBreakerPolicy AdvancedCircuitBreakerAsync(this PolicyBuilder policyBuilder, double failureThreshold, TimeSpan samplingDuration, int minimumThroughput, TimeSpan durationOfBreak, Action<Exception, TimeSpan, Context> onBreak, Action<Context> onReset, Action onHalfOpen)
{
TimeSpan t = TimeSpan.FromTicks(AdvancedCircuitController<EmptyStruct>.ResolutionOfCircuitTimer);
if (failureThreshold <= 0)
throw new ArgumentOutOfRangeException("failureThreshold", "Value must be greater than zero.");
if (failureThreshold > 1)
throw new ArgumentOutOfRangeException("failureThreshold", "Value must be less than or equal to one.");
if (samplingDuration < t)
throw new ArgumentOutOfRangeException("samplingDuration", $"""{new object[1] {
t.TotalMilliseconds
}}""");
if (minimumThroughput <= 1)
throw new ArgumentOutOfRangeException("minimumThroughput", "Value must be greater than one.");
if (durationOfBreak < TimeSpan.Zero)
throw new ArgumentOutOfRangeException("durationOfBreak", "Value must be greater than zero.");
if (onBreak == null)
throw new ArgumentNullException("onBreak");
if (onReset == null)
throw new ArgumentNullException("onReset");
if (onHalfOpen == null)
throw new ArgumentNullException("onHalfOpen");
AdvancedCircuitController<EmptyStruct> breakerController = new AdvancedCircuitController<EmptyStruct>(failureThreshold, samplingDuration, minimumThroughput, durationOfBreak, delegate(DelegateResult<EmptyStruct> outcome, TimeSpan timespan, Context context) {
onBreak(outcome.Exception, timespan, context);
}, onReset, onHalfOpen);
return new CircuitBreakerPolicy((Func<Context, CancellationToken, Task> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) => CircuitBreakerEngine.ImplementationAsync(async delegate(Context ctx, CancellationToken ct) {
await action(ctx, ct).ConfigureAwait(continueOnCapturedContext);
return EmptyStruct.Instance;
}, context, policyBuilder.ExceptionPredicates, PredicateHelper<EmptyStruct>.EmptyResultPredicates, breakerController, cancellationToken, continueOnCapturedContext), policyBuilder.ExceptionPredicates, breakerController);
}
}
}