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); }
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(); }
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); } }