Ejemplo n.º 1
0
        public async Task RetryPolicyTest_LinearJitterStrategyRetryPolicy_Success()
        {
            await RunWithTelemetryAsync(
                totalOfExecutions : 1,
                runInParallel : true,
                handler : async execution => {
                #region Arrange
                var result      = false;
                var retryPolicy = new RetryPolicy(
                    "linearJitter",
                    new RetryPolicyParams(
                        maxAttempts: 3,
                        jitterStrategyType: JitterStrategyTypeEnum.Linear,
                        timeSpanBase: TimeSpan.FromSeconds(3),
                        customJitterTimeFunction: null
                        )
                    );
                var totalOfFails = 0;
                #endregion

                #region Act
                var sw = Stopwatch.StartNew();
                var policyExecutionResultA = await retryPolicy.ExecutePolicyAsync(async(attempt) => {
                    return(await Task.FromResult(true));
                });
                var policyExecutionResultB = await retryPolicy.ExecutePolicyAsync(async(attempt) => {
                    var result = await Task.FromResult(attempt == 3);

                    if (!result)
                    {
                        totalOfFails++;
                    }

                    return(result);
                });
                sw.Stop();

                result = policyExecutionResultA.success &&
                         policyExecutionResultB.success &&
                         sw.ElapsedMilliseconds >= 9_000 &&
                         sw.ElapsedMilliseconds <= 10_000 &&
                         totalOfFails == 2
                ;
                #endregion

                #region Assert
                return(result);

                #endregion
            }
                ).ConfigureAwait(false);
        }
Ejemplo n.º 2
0
        public async Task RetryPolicyTest_CustomJitterStrategyRetryPolicy_Success()
        {
            await RunWithTelemetryAsync(
                totalOfExecutions : 1,
                runInParallel : true,
                handler : async execution => {
                #region Arrange
                var result      = false;
                var retryPolicy = new RetryPolicy(
                    "exponentialJitter",
                    new RetryPolicyParams(
                        maxAttempts: 3,
                        jitterStrategyType: JitterStrategyTypeEnum.Custom,
                        timeSpanBase: TimeSpan.FromSeconds(2),
                        customJitterTimeFunction: attemp => {
                    return(TimeSpan.FromSeconds(attemp + 1));
                }
                        )
                    );
                #endregion

                #region Act
                var sw = Stopwatch.StartNew();

                var policyExecutionResultA = await retryPolicy.ExecutePolicyAsync(async(attempt) => {
                    return(await Task.FromResult(true));
                });
                var policyExecutionResultB = await retryPolicy.ExecutePolicyAsync(async(attempt) => {
                    return(await Task.FromResult(attempt == 3));
                });

                sw.Stop();

                result = policyExecutionResultA.success &&
                         policyExecutionResultB.success &&
                         sw.ElapsedMilliseconds >= 5_000 &&
                         sw.ElapsedMilliseconds <= 6_000
                ;
                #endregion

                #region Assert
                return(result);

                #endregion
            }
                ).ConfigureAwait(false);
        }
Ejemplo n.º 3
0
        public async Task <(bool success, int attempt)> ExecutePolicyAsync(Func <int, Task <bool> > executionFunction)
        {
            if (CircuitState == CircuitStateEnum.Opened)
            {
                return(success : false, attempt : CurrentAttempt);
            }

            CurrentAttempt++;

            var retryPatternPolicyResult = await _retryPolicy.ExecutePolicyAsync(executionFunction);

            if (!retryPatternPolicyResult.success)
            {
                ChangeCircuitState(
                    CircuitStateEnum.Opened,
                    retryPatternPolicyResult.currentAttempt,
                    CurrentAttempt);

                _ = Task.Run(() =>
                {
                    Thread.Sleep(_windowSleepTime);

                    ChangeCircuitState(
                        CircuitStateEnum.HalfOpened,
                        retryPatternPolicyResult.currentAttempt,
                        CurrentAttempt
                        );
                });

                return(success : false, attempt : CurrentAttempt);
            }

            var successCurrentAttempt = CurrentAttempt;

            if (CircuitState == CircuitStateEnum.HalfOpened)
            {
                ChangeCircuitState(
                    CircuitStateEnum.Closed,
                    retryPatternPolicyResult.currentAttempt,
                    CurrentAttempt
                    );
            }

            return(success : true, attempt : successCurrentAttempt);
        }