public static IEasyCachingBus WithCircuitBreaker(
            string name,
            Func <IEasyCachingBus> busFactory,
            ICircuitBreakerParameters initParameters,
            ICircuitBreakerParameters executeParameters,
            TimeSpan subscribeRetryInterval,
            Func <Exception, bool> exceptionFilter)
        {
            var policyBuilder           = exceptionFilter.GetHandleExceptionPolicyBuilder();
            var policyBuilderWithResult = exceptionFilter.GetHandleExceptionPolicyBuilder <IEasyCachingBus>();

            var initFallbackPolicy = policyBuilderWithResult.Fallback(
                fallbackAction: (result, _, __) => new ExceptionEasyCachingBus(result.Exception),
                onFallback: (_, __) => { });
            var initCircuitBreakerPolicy = initParameters.CreatePolicy(policyBuilderWithResult);
            var initPolicy = Policy.Wrap(initFallbackPolicy, initCircuitBreakerPolicy);

            var syncExecutePolicy  = executeParameters.CreatePolicy(policyBuilder);
            var asyncExecutePolicy = executeParameters.CreatePolicyAsync(policyBuilder);
            var subscribePolicy    = policyBuilder.WaitAndRetryForeverAsync(_ => subscribeRetryInterval);

            return(new EasyCachingBusPolicyDecorator(
                       name,
                       busFactory,
                       initPolicy: initPolicy,
                       syncExecutePolicy: syncExecutePolicy,
                       asyncExecutePolicy: asyncExecutePolicy,
                       subscribePolicy: subscribePolicy));
        }
 public static IProviderOptionsWithDecorator <IEasyCachingProvider> DecorateWithCircuitBreaker(
     this IProviderOptionsWithDecorator <IEasyCachingProvider> options,
     ICircuitBreakerParameters initParameters,
     ICircuitBreakerParameters executeParameters,
     Func <Exception, bool> exceptionFilter)
 {
     return(options.Decorate((name, serviceProvider, cachingProviderFactory) =>
                             () => new DecoratedEasyCachingProvider(
                                 name,
                                 cachingProviderFactory.WithCircuitBreaker(initParameters, executeParameters, exceptionFilter))
                             ));
 }
Beispiel #3
0
 public static IBusOptions DecorateWithCircuitBreaker(
     this IBusOptions options,
     ICircuitBreakerParameters initParameters,
     ICircuitBreakerParameters executeParameters,
     TimeSpan subscribeRetryInterval,
     Func <Exception, bool> exceptionFilter) =>
 options.Decorate((name, serviceProvider, cachingBusFactory) =>
                  () => EasyCachingBusPolicyDecorator.WithCircuitBreaker(
                      name,
                      cachingBusFactory,
                      initParameters,
                      executeParameters,
                      subscribeRetryInterval,
                      exceptionFilter));
        private static IEasyCachingProviderDecorator <TProvider> WithCircuitBreaker <TProvider>(
            this Func <TProvider> cachingProviderFactory,
            ICircuitBreakerParameters initParameters,
            ICircuitBreakerParameters executeParameters,
            Func <Exception, bool> exceptionFilter) where TProvider : class, IEasyCachingProviderBase
        {
            var policyBuilder      = exceptionFilter.GetHandleExceptionPolicyBuilder();
            var initPolicy         = initParameters.CreatePolicy(policyBuilder);
            var syncExecutePolicy  = executeParameters.CreatePolicy(policyBuilder);
            var asyncExecutePolicy = executeParameters.CreatePolicyAsync(policyBuilder);

            return(new EasyCachingProviderPolicyDecorator <TProvider>(
                       cachingProviderFactory,
                       initPolicy,
                       syncExecutePolicy,
                       asyncExecutePolicy));
        }