internal AsyncCircuitBreakerPolicy(
     PolicyBuilder policyBuilder,
     ICircuitController <EmptyStruct> breakerController
     ) : base(policyBuilder)
 {
     _breakerController = breakerController;
 }
        internal static async Task ImplementationAsync(Func<CancellationToken, Task> action, Context context, IEnumerable<ExceptionPredicate> shouldHandlePredicates, ICircuitController breakerController, CancellationToken cancellationToken, bool continueOnCapturedContext)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                await action(cancellationToken).ConfigureAwait(continueOnCapturedContext);

                breakerController.OnActionSuccess(context);
            }
            catch (Exception ex)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    if (ex is OperationCanceledException && ((OperationCanceledException) ex).CancellationToken == cancellationToken)
                    {
                        throw;
                    }
                    cancellationToken.ThrowIfCancellationRequested();
                }

                if (!shouldHandlePredicates.Any(predicate => predicate(ex)))
                {
                    throw;
                }

                breakerController.OnActionFailure(ex, context);

                throw;
            }
        }
Example #3
0
 internal CircuitBreakerPolicy(
     Action <Action <CancellationToken>, Context, CancellationToken> exceptionPolicy,
     IEnumerable <ExceptionPredicate> exceptionPredicates,
     ICircuitController <EmptyStruct> breakerController
     ) : base(exceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
Example #4
0
 internal CircuitBreakerPolicy(
     Action<Action<CancellationToken>, Context, CancellationToken> exceptionPolicy, 
     IEnumerable<ExceptionPredicate> exceptionPredicates,
     ICircuitController<EmptyStruct> breakerController
     ) : base(exceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
Example #5
0
 internal CircuitBreakerPolicy(
     Func <Func <CancellationToken, Task>, Context, CancellationToken, bool, Task> asyncExceptionPolicy,
     IEnumerable <ExceptionPredicate> exceptionPredicates,
     ICircuitController <EmptyStruct> breakerController
     ) : base(asyncExceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
 internal CircuitBreakerPolicy(
     Func<Func<CancellationToken, Task>, Context, CancellationToken, bool, Task> asyncExceptionPolicy, 
     IEnumerable<ExceptionPredicate> exceptionPredicates, 
     ICircuitController<EmptyStruct> breakerController
     ) : base(asyncExceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
Example #7
0
        internal static async Task <TResult> ImplementationAsync <TResult>(
            Func <CancellationToken, Task <TResult> > action,
            Context context,
            IEnumerable <ExceptionPredicate> shouldHandleExceptionPredicates,
            IEnumerable <ResultPredicate <TResult> > shouldHandleResultPredicates,
            ICircuitController <TResult> breakerController,
            CancellationToken cancellationToken,
            bool continueOnCapturedContext)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                DelegateResult <TResult> delegateOutcome = new DelegateResult <TResult>(await action(cancellationToken).ConfigureAwait(continueOnCapturedContext));

                cancellationToken.ThrowIfCancellationRequested();

                if (shouldHandleResultPredicates.Any(predicate => predicate(delegateOutcome.Result)))
                {
                    breakerController.OnActionFailure(delegateOutcome, context);
                }
                else
                {
                    breakerController.OnActionSuccess(context);
                }

                return(delegateOutcome.Result);
            }
            catch (Exception ex)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    if (ex is OperationCanceledException && ((OperationCanceledException)ex).CancellationToken == cancellationToken)
                    {
                        throw;
                    }
                    cancellationToken.ThrowIfCancellationRequested();
                }

                if (!shouldHandleExceptionPredicates.Any(predicate => predicate(ex)))
                {
                    throw;
                }

                breakerController.OnActionFailure(new DelegateResult <TResult>(ex), context);

                throw;
            }
        }
Example #8
0
        internal static async Task <TResult> ImplementationAsync <TResult>(
            Func <Context, CancellationToken, Task <TResult> > action,
            Context context,
            IEnumerable <ExceptionPredicate> shouldHandleExceptionPredicates,
            IEnumerable <ResultPredicate <TResult> > shouldHandleResultPredicates,
            ICircuitController <TResult> breakerController,
            CancellationToken cancellationToken,
            bool continueOnCapturedContext)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                TResult result = await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext);

                if (shouldHandleResultPredicates.Any(predicate => predicate(result)))
                {
                    breakerController.OnActionFailure(new DelegateResult <TResult>(result), context);
                }
                else
                {
                    breakerController.OnActionSuccess(context);
                }

                return(result);
            }
            catch (Exception ex)
            {
                Exception handledException = shouldHandleExceptionPredicates
                                             .Select(predicate => predicate(ex))
                                             .FirstOrDefault(e => e != null);
                if (handledException == null)
                {
                    throw;
                }

                breakerController.OnActionFailure(new DelegateResult <TResult>(handledException), context);

                if (handledException != ex)
                {
                    ExceptionDispatchInfo.Capture(handledException).Throw();
                }
                throw;
            }
        }
Example #9
0
        private static void ThrowIfCircuitBroken(ICircuitController breakerController)
        {
            switch (breakerController.CircuitState)
            {
            case CircuitState.Closed:
            case CircuitState.HalfOpen:
                break;

            case CircuitState.Open:
                throw new BrokenCircuitException("The circuit is now open and is not allowing calls.", breakerController.LastException);

            case CircuitState.Isolated:
                throw new IsolatedCircuitException("The circuit is manually held open and is not allowing calls.");

            default:
                throw new InvalidOperationException("Unhandled CircuitState.");
            }
        }
Example #10
0
        internal static TResult Implementation <TResult>(
            Func <Context, CancellationToken, TResult> action,
            Context context,
            CancellationToken cancellationToken,
            ExceptionPredicates shouldHandleExceptionPredicates,
            ResultPredicates <TResult> shouldHandleResultPredicates,
            ICircuitController <TResult> breakerController)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                TResult result = action(context, cancellationToken);

                if (shouldHandleResultPredicates.AnyMatch(result))
                {
                    breakerController.OnActionFailure(new DelegateResult <TResult>(result), context);
                }
                else
                {
                    breakerController.OnActionSuccess(context);
                }

                return(result);
            }
            catch (Exception ex)
            {
                Exception handledException = shouldHandleExceptionPredicates.FirstMatchOrDefault(ex);
                if (handledException == null)
                {
                    throw;
                }

                breakerController.OnActionFailure(new DelegateResult <TResult>(handledException), context);

                if (handledException != ex)
                {
                    ExceptionDispatchInfo.Capture(handledException).Throw();
                }
                throw;
            }
        }
        internal static async Task <TResult> ImplementationAsync <TResult>(
            Func <Context, CancellationToken, Task <TResult> > action,
            Context context,
            CancellationToken cancellationToken,
            bool continueOnCapturedContext,
            ExceptionPredicates shouldHandleExceptionPredicates,
            ResultPredicates <TResult> shouldHandleResultPredicates,
            ICircuitController <TResult> breakerController)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                TResult result = await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext);

                if (shouldHandleResultPredicates.AnyMatch(result))
                {
                    breakerController.OnActionFailure(new DelegateResult <TResult>(result), context);
                }
                else
                {
                    breakerController.OnActionSuccess(context);
                }

                return(result);
            }
            catch (Exception ex)
            {
                Exception handledException = shouldHandleExceptionPredicates.FirstMatchOrDefault(ex);
                if (handledException == null)
                {
                    throw;
                }

                breakerController.OnActionFailure(new DelegateResult <TResult>(handledException), context);

                handledException.RethrowWithOriginalStackTraceIfDiffersFrom(ex);
                throw;
            }
        }
Example #12
0
        internal static TResult Implementation <TResult>(
            Func <CancellationToken, TResult> action,
            Context context,
            CancellationToken cancellationToken,
            IEnumerable <ExceptionPredicate> shouldHandleExceptionPredicates,
            IEnumerable <ResultPredicate <TResult> > shouldHandleResultPredicates,
            ICircuitController <TResult> breakerController)
        {
            cancellationToken.ThrowIfCancellationRequested();

            breakerController.OnActionPreExecute();

            try
            {
                DelegateResult <TResult> delegateOutcome = new DelegateResult <TResult>(action(cancellationToken));

                if (shouldHandleResultPredicates.Any(predicate => predicate(delegateOutcome.Result)))
                {
                    breakerController.OnActionFailure(delegateOutcome, context);
                }
                else
                {
                    breakerController.OnActionSuccess(context);
                }

                return(delegateOutcome.Result);
            }
            catch (Exception ex)
            {
                if (!shouldHandleExceptionPredicates.Any(predicate => predicate(ex)))
                {
                    throw;
                }

                breakerController.OnActionFailure(new DelegateResult <TResult>(ex), context);

                throw;
            }
        }
        internal static async Task ImplementationAsync(Func <CancellationToken, Task> action, Context context, IEnumerable <ExceptionPredicate> shouldHandlePredicates, ICircuitController breakerController, CancellationToken cancellationToken, bool continueOnCapturedContext)
        {
            cancellationToken.ThrowIfCancellationRequested();

            ThrowIfCircuitBroken(breakerController);

            try
            {
                await action(cancellationToken).ConfigureAwait(continueOnCapturedContext);

                breakerController.OnActionSuccess(context);
            }
            catch (Exception ex)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    if (ex is OperationCanceledException && ((OperationCanceledException)ex).CancellationToken == cancellationToken)
                    {
                        throw;
                    }
                    cancellationToken.ThrowIfCancellationRequested();
                }

                if (!shouldHandlePredicates.Any(predicate => predicate(ex)))
                {
                    throw;
                }

                breakerController.OnActionFailure(ex, context);

                throw;
            }
        }
Example #14
0
        internal static void Implementation(Action action, Context context, IEnumerable <ExceptionPredicate> shouldHandlePredicates, ICircuitController breakerController)
        {
            ThrowIfCircuitBroken(breakerController);

            try
            {
                action();
                breakerController.OnActionSuccess(context);
            }
            catch (Exception ex)
            {
                if (!shouldHandlePredicates.Any(predicate => predicate(ex)))
                {
                    throw;
                }

                breakerController.OnActionFailure(ex, context);

                throw;
            }
        }
 internal CircuitBreakerPolicy(Action<Action, Context> exceptionPolicy, IEnumerable<ExceptionPredicate> exceptionPredicates, ICircuitController breakerController)
     : base(exceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
Example #16
0
 internal CircuitBreakerPolicy(Action <Action, Context> exceptionPolicy, IEnumerable <ExceptionPredicate> exceptionPredicates, ICircuitController breakerController)
     : base(exceptionPolicy, exceptionPredicates)
 {
     _breakerController = breakerController;
 }
Example #17
0
 internal CircuitBreakerPolicy(
     PolicyBuilder <TResult> policyBuilder,
     ICircuitController <TResult> breakerController
     ) : base(policyBuilder)
     => _breakerController = breakerController;