コード例 #1
0
 public DataService(ILogger <DataService> logger, TodoRepository todoRepository, RetryPolicyHandler retryPolicyHandler, ResilienceSettings resilienceSettings)
 {
     _logger             = logger;
     _todoRepository     = todoRepository;
     _retryPolicyHandler = retryPolicyHandler;
     _resilienceSettings = resilienceSettings;
 }
コード例 #2
0
        public void ResiliencePolicyManager_WhenRequestIsWorthRetrying_RequestIsRetriedAccordingToSettings()
        {
            var AMOUNT_OF_RETRIES = 3;

            var resilienceSettings = new ResilienceSettings()
            {
                AmountOfRetries = AMOUNT_OF_RETRIES, BreakerAttemptThreshold = AMOUNT_OF_RETRIES * 2, CircuitBreakerTrippedTimeoutInSeconds = 10
            };
            var sut = new ResiliencePolicyManager(resilienceSettings);

            var expected = 1 + AMOUNT_OF_RETRIES;

            int actual = 0;
            var func   = new Func <IRestResponse>(
                () =>
            {
                actual++;
                return(new RestResponse {
                    StatusCode = sut.StatusCodesWorthRetrying.First()
                });
            }
                );

            sut.ResiliencePolicy.Execute(func);

            Assert.Equal(actual, expected);
        }
コード例 #3
0
 public MockDbInteractorFacade(
     ResilienceSettings resilienceSettings,
     Action <MySqlException, TimeSpan> onRetry)
 {
     this.resilienceSettings = resilienceSettings;
     this.onRetry            = onRetry;
 }
コード例 #4
0
        static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                         .WriteTo.ColoredConsole()
                         .CreateLogger();

            var container = new Container();

            container.RegisterSingleton <PlaygroundCoordinator>();
            container.RegisterSingleton <IResiliencePatternRepository, ResiliencePatternRepository>();
            container.RegisterSingleton <IResiliencePolicyManager, ResiliencePolicyManager>();

            var resilienceSettings = new ResilienceSettings()
            {
                AmountOfRetries         = 3,
                BreakerAttemptThreshold = 2,
                CircuitBreakerTrippedTimeoutInSeconds = 1,
            };

            container.RegisterSingleton <IResilienceSettings>(resilienceSettings);

            var playgroundCoordinator = container.GetInstance <PlaygroundCoordinator>();

            playgroundCoordinator.HaveSomeFun();
            Console.ReadKey();
        }
コード例 #5
0
        /// <summary>
        /// Asynchronous retry policy that returns Task of <typeparamref name="T"/>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="action"></param>
        /// <param name="customResilienceSettings"></param>
        /// <param name="onRetry"></param>
        /// <returns></returns>
        protected async Task <T> ExecuteWithAsyncRetries <T>(
            Func <Task <T> > action,
            ResilienceSettings customResilienceSettings = null,
            Action <MySqlException, TimeSpan> onRetry   = null) =>

        await MySqlFailoverRetryPolicies
        .DefaultAsyncPolicy(
            customResilienceSettings,
            onRetry)
        .ExecuteAsync(async() =>
        {
            try
            {
                return(await action());
            }
            catch (MySqlException ex)
            {
                ClearConnectionPoolIfDatabaseFailingOver(ex);

                throw;
            }
        });
コード例 #6
0
        /// <summary>
        /// Synchronous retry policy of void return type
        /// </summary>
        /// <param name="action"></param>
        /// <param name="customResilienceSettings"></param>
        /// <param name="onRetry"></param>
        protected void ExecuteWithSyncRetries(
            Action action,
            ResilienceSettings customResilienceSettings = null,
            Action <MySqlException, TimeSpan> onRetry   = null) =>

        MySqlFailoverRetryPolicies
        .DefaultSyncPolicy(
            customResilienceSettings,
            onRetry)
        .Execute(() =>
        {
            try
            {
                action();
            }
            catch (MySqlException ex)
            {
                ClearConnectionPoolIfDatabaseFailingOver(ex);

                throw;
            }
        });
コード例 #7
0
        public void ResiliencePolicyManager_WhenRequestFailsTooManyTimes_CircuitBreakerIsTripped()
        {
            var AMOUNT_OF_RETRIES         = 10;
            var BREAKER_ATTEMPT_THRESHOLD = 3;

            var resilienceSettings = new ResilienceSettings()
            {
                AmountOfRetries = AMOUNT_OF_RETRIES, BreakerAttemptThreshold = BREAKER_ATTEMPT_THRESHOLD, CircuitBreakerTrippedTimeoutInSeconds = 10
            };
            var sut = new ResiliencePolicyManager(resilienceSettings);

            var expected = BREAKER_ATTEMPT_THRESHOLD;

            var func = new Func <IRestResponse>(
                () =>
            {
                return(new RestResponse {
                    StatusCode = sut.StatusCodesWorthRetrying.First()
                });
            }
                );

            Assert.Throws <BrokenCircuitException <IRestResponse> >(() => sut.ResiliencePolicy.Execute(func));
        }
コード例 #8
0
 public DefaultResiliencePolicy(ILogger logger, ResilienceSettings resilienceSettings = default(ResilienceSettings))
 {
     this.logger             = logger;
     this.resilienceSettings = resilienceSettings ?? ResilienceSettings.Default;
 }