public DataService(ILogger <DataService> logger, TodoRepository todoRepository, RetryPolicyHandler retryPolicyHandler, ResilienceSettings resilienceSettings) { _logger = logger; _todoRepository = todoRepository; _retryPolicyHandler = retryPolicyHandler; _resilienceSettings = resilienceSettings; }
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); }
public MockDbInteractorFacade( ResilienceSettings resilienceSettings, Action <MySqlException, TimeSpan> onRetry) { this.resilienceSettings = resilienceSettings; this.onRetry = onRetry; }
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(); }
/// <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; } });
/// <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; } });
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)); }
public DefaultResiliencePolicy(ILogger logger, ResilienceSettings resilienceSettings = default(ResilienceSettings)) { this.logger = logger; this.resilienceSettings = resilienceSettings ?? ResilienceSettings.Default; }