Exemple #1
0
        public override T Execute <T>(Func <IRetryContext, T> retryCallback, IRecoveryCallback <T> recoveryCallback)
        {
            var policy       = BuildPolicy <T>();
            var retryContext = new RetryContext();
            var context      = new Context();

            context.Add(RETRYCONTEXT_KEY, retryContext);
            RetrySynchronizationManager.Register(retryContext);
            if (recoveryCallback != null)
            {
                retryContext.SetAttribute(RECOVERY_CALLBACK_KEY, recoveryCallback);
            }

            CallListenerOpen(retryContext);
            var result = policy.Execute(
                (ctx) =>
            {
                var callbackResult = retryCallback(retryContext);
                if (recoveryCallback != null)
                {
                    var recovered = (bool?)retryContext.GetAttribute(RECOVERED);
                    if (recovered != null && recovered.Value)
                    {
                        callbackResult = (T)retryContext.GetAttribute(RECOVERED_RESULT);
                    }
                }

                return(callbackResult);
            }, context);

            CallListenerClose(retryContext, retryContext.LastException);
            RetrySynchronizationManager.Clear();
            return(result);
        }
Exemple #2
0
        public override void Execute(Action <IRetryContext> retryCallback, IRecoveryCallback recoveryCallback)
        {
            var policy       = BuildPolicy <object>();
            var retryContext = new RetryContext();
            var context      = new Context();

            context.Add(RETRYCONTEXT_KEY, retryContext);
            RetrySynchronizationManager.Register(retryContext);
            if (recoveryCallback != null)
            {
                retryContext.SetAttribute(RECOVERY_CALLBACK_KEY, recoveryCallback);
            }

            if (!CallListenerOpen(retryContext))
            {
                throw new TerminatedRetryException("Retry terminated abnormally by interceptor before first attempt");
            }

            policy.Execute(
                (ctx) =>
            {
                retryCallback(retryContext);
                return(null);
            }, context);

            CallListenerClose(retryContext, retryContext.LastException);
            RetrySynchronizationManager.Clear();
        }
Exemple #3
0
 private RetryContext GetRetryContext(Context context)
 {
     if (context.TryGetValue(RETRYCONTEXT_KEY, out var obj))
     {
         return((RetryContext)obj);
     }
     else
     {
         var result = new RetryContext();
         RetrySynchronizationManager.Register(result);
         return(result);
     }
 }