public bool ExecuteException(CircuitBreakerParameters model)
 {
     try
     {
         if (model.Exception.IsNotNull())
         {
             var processExists = this._user.GetCircuitBreaker().Where(_ => _.Process == model.Process).SingleOrDefault();
             if (processExists.IsNull())
             {
                 var CircuitBreaker = new CurrentUser.CircuitBreakerMananger();
                 CircuitBreaker.SetProcess(model.Process);
                 CircuitBreaker.AddErrorCount();
                 CircuitBreaker.SetSecurityDateStop(DateTime.Now.ToTimeZone());
                 this._user.AddCircuitBreaker(CircuitBreaker);
             }
             else
             {
                 processExists.AddErrorCount();
                 processExists.SetSecurityDateStop(DateTime.Now.ToTimeZone());
             }
         }
     }
     catch (Exception ex)
     {
         this._logger.LogError(ex.ToString());
     }
     return(true);
 }
        private IEasyCachingProvider CreateCachingProviderWithUnavailableRedisAndFallback()
        {
            var serviceProvider = CreateServiceProvider(options =>
            {
                options.DBConfig.Configuration = "127.0.0.1:9999,allowAdmin=false,defaultdatabase=9,connectTimeout=1";

                var initCircuitBreakerParameters =
                    new CircuitBreakerParameters(
                        exceptionsAllowedBeforeBreaking: 1,
                        durationOfBreak: TimeSpan.FromMinutes(1));
                var executeCircuitBreakerParameters =
                    new AdvancedCircuitBreakerParameters(
                        failureThreshold: 0.1,
                        samplingDuration: TimeSpan.FromSeconds(15),
                        minimumThroughput: 10,
                        durationOfBreak: TimeSpan.FromSeconds(60));

                options
                .DecorateWithCircuitBreaker(
                    initCircuitBreakerParameters,
                    executeCircuitBreakerParameters,
                    exceptionFilter: RedisOptionsExtensions.RedisExceptionFilter)
                .DecorateWithFallback(
                    (name, _) => new NullCachingProvider(name, options),
                    exceptionFilter: RedisOptionsExtensions.RedisExceptionFilter);
            });

            return(serviceProvider.GetService <IEasyCachingProvider>());
        }
Exemplo n.º 3
0
        protected IEasyCachingProvider CreateDecoratedProvider() =>
        ServiceBuilders.CreateFakeProvider(options =>
        {
            options.ProviderFactory = CreateProvider;

            var circuitBreakerParameters = new CircuitBreakerParameters(
                exceptionsAllowedBeforeBreaking: 1,
                durationOfBreak: TimeSpan.FromMinutes(1));

            options.DecorateWithCircuitBreaker(
                initParameters: circuitBreakerParameters,
                executeParameters: circuitBreakerParameters,
                exception => exception is InvalidOperationException);
        });
Exemplo n.º 4
0
        protected IEasyCachingBus CreateDecoratedProvider() =>
        ServiceBuilders.CreateFakeBus(options =>
        {
            options.BusFactory = CreateBus;

            var circuitBreakerParameters = new CircuitBreakerParameters(
                exceptionsAllowedBeforeBreaking: 1,
                durationOfBreak: TimeSpan.FromMinutes(1));

            options.DecorateWithCircuitBreaker(
                initParameters: circuitBreakerParameters,
                executeParameters: circuitBreakerParameters,
                subscribeRetryInterval: TimeSpan.FromMilliseconds(1),
                exceptionFilter: exception => exception is InvalidOperationException);
        });
Exemplo n.º 5
0
        public static IEasyCachingProvider CreateDecoratedProvider(
            Func <IEasyCachingProvider> providerFactory, IEasyCachingProvider fallbackProvider) =>
        ServiceBuilders.CreateFakeProvider(options =>
        {
            options.ProviderFactory = providerFactory;

            var circuitBreakerParameters = new CircuitBreakerParameters(
                exceptionsAllowedBeforeBreaking: 1,
                durationOfBreak: TimeSpan.FromMinutes(1));

            options
            .DecorateWithCircuitBreaker(
                initParameters: circuitBreakerParameters,
                executeParameters: circuitBreakerParameters,
                exception => exception is InvalidOperationException)
            .DecorateWithFallback(
                (_, __) => fallbackProvider,
                exception => exception is InvalidOperationException);
        });
        public void Subscribe_With_Circuit_Breaker_Subscribe_Exception_Should_Not_Break()
        {
            var circuitBreakerParameters = new CircuitBreakerParameters(
                exceptionsAllowedBeforeBreaking: 1,
                durationOfBreak: TimeSpan.FromMinutes(1));

            var(hybridProvider, _, _, _) = CreateCachingProviderWithFakes(
                decorateFakeBus: options => options.DecorateWithCircuitBreaker(
                    initParameters: circuitBreakerParameters,
                    executeParameters: circuitBreakerParameters,
                    subscribeRetryInterval: TimeSpan.FromMinutes(1),
                    exceptionFilter: exception => exception is InvalidOperationException),
                setupFakeBus: bus =>
                A.CallTo(() => bus.Subscribe("test_topic", A <Action <EasyCachingMessage> > ._)).Throws(new InvalidOperationException())
                );

            hybridProvider.RemoveAsync("fake-remove");

            Assert.True(true);
        }
        private IHybridCachingProvider CreateCachingProviderWithCircuitBreakerAndFallback(string connectionString) =>
        CreateService <IHybridCachingProvider>(services =>
        {
            services.AddEasyCaching(x =>
            {
                x.UseInMemory(LocalCacheProviderName);

                var circuitBreakerParameters = new CircuitBreakerParameters(
                    exceptionsAllowedBeforeBreaking: 1,
                    durationOfBreak: TimeSpan.FromMinutes(1));

                x.UseRedis(options =>
                {
                    options.DBConfig.Configuration = connectionString;

                    options.DecorateWithCircuitBreaker(
                        initParameters: circuitBreakerParameters,
                        executeParameters: circuitBreakerParameters,
                        exceptionFilter: RedisOptionsExtensions.RedisExceptionFilter);
                },
                           DistributedCacheProviderName);

                x.WithRedisBus(options =>
                {
                    options.Configuration = connectionString;

                    options
                    .DecorateWithCircuitBreaker(
                        initParameters: circuitBreakerParameters,
                        executeParameters: circuitBreakerParameters,
                        subscribeRetryInterval: TimeSpan.FromMinutes(1),
                        exceptionFilter: RedisOptionsExtensions.RedisExceptionFilter)
                    .DecorateWithRetry(1, RedisOptionsExtensions.RedisExceptionFilter)
                    .DecorateWithPublishFallback(RedisOptionsExtensions.RedisExceptionFilter);
                });

                UseHybrid(x);
            });
        });
        CreateCachingProviderWithFakes(
            Action <FakeBusOptions> decorateFakeBus = null,
            Action <IEasyCachingProvider> setupFakeDistributedProvider = null,
            Action <IEasyCachingBus> setupFakeBus = null)
        {
            var fakeBus = A.Fake <IEasyCachingBus>();

            setupFakeBus?.Invoke(fakeBus);

            var fakeDistributedProvider = A.Fake <IEasyCachingProvider>();

            A.CallTo(() => fakeDistributedProvider.Name).Returns(DistributedCacheProviderName);
            setupFakeDistributedProvider?.Invoke(fakeDistributedProvider);

            var services = new ServiceCollection();

            services.AddEasyCaching(x =>
            {
                x.UseInMemory(LocalCacheProviderName);

                x.UseFakeProvider(
                    options =>
                {
                    options.ProviderFactory = () => fakeDistributedProvider;

                    var circuitBreakerParameters = new CircuitBreakerParameters(
                        exceptionsAllowedBeforeBreaking: 2,
                        durationOfBreak: TimeSpan.FromMinutes(1));

                    options.DecorateWithCircuitBreaker(
                        initParameters: circuitBreakerParameters,
                        executeParameters: circuitBreakerParameters,
                        exception => exception is InvalidOperationException);
                },
                    DistributedCacheProviderName);

                x.WithFakeBus(options =>
                {
                    options.BusFactory = () => fakeBus;

                    if (decorateFakeBus != null)
                    {
                        decorateFakeBus(options);
                    }
                    else
                    {
                        options
                        .DecorateWithRetry(retryCount: 1, exceptionFilter: null)
                        .DecorateWithPublishFallback(exceptionFilter: null);
                    };
                });

                UseHybrid(x);
            });

            var serviceProvider = services.BuildServiceProvider();

            return(
                serviceProvider.GetService <IHybridCachingProvider>(),
                serviceProvider.GetService <IEasyCachingProviderFactory>().GetCachingProvider(LocalCacheProviderName),
                fakeDistributedProvider,
                fakeBus);
        }