public CompensableAttribute(string compensationMethod, int retryDelayInMilliseconds = 0, int timeout = 0, int retries = 0) { _omegaContext = (OmegaContext)ServiceLocator.Current.GetInstance(typeof(OmegaContext)); _compensableInterceptor = (IEventAwareInterceptor)ServiceLocator.Current.GetInstance(typeof(IEventAwareInterceptor)); _recoveryPolicy = (IRecoveryPolicy)ServiceLocator.Current.GetInstance(typeof(IRecoveryPolicy)); _compensationContext = (CompensationContext)ServiceLocator.Current.GetInstance(typeof(CompensationContext)); _messageFormat = (IMessageSerializer)ServiceLocator.Current.GetInstance(typeof(IMessageSerializer)); Retries = retries; CompensationMethod = compensationMethod; RetryDelayInMilliseconds = retryDelayInMilliseconds; Timeout = timeout; _parenttxId = _omegaContext.GetGlobalTxId(); }
private AsyncRetryPolicy<IConnection> CreateConnectionRetryPolicy(IRecoveryPolicy recoveryPolicy) { return Policy<IConnection> .Handle<Exception>() .WaitAndRetryAsync(recoveryPolicy.RetryCount, (retryAttempt, context) => { context.SetRetryCount(retryAttempt); return recoveryPolicy.GetDelay(retryAttempt); }, (result, _, context) => { var retryCount = context.GetRetryCount(); var endpoint = GetCurrentEndpoint(context); if (result.Exception != null) { Log.FailedToEstablishConnection(_logger, endpoint, retryCount, result.Exception); } else { Log.ConnectionEstablished(_logger, endpoint, retryCount); } }); }
public AutoRecoveringConnection(ILoggerFactory loggerFactory, IEnumerable<Endpoint> endpoints, IRecoveryPolicy recoveryPolicy, Func<IMessageIdPolicy> messageIdPolicyFactory) { _logger = loggerFactory.CreateLogger<AutoRecoveringConnection>(); _loggerFactory = loggerFactory; _messageIdPolicyFactory = messageIdPolicyFactory; _endpoints = endpoints.ToArray(); var channel = Channel.CreateUnbounded<ConnectCommand>(); _reader = channel.Reader; _writer = channel.Writer; _connectionRetryPolicy = CreateConnectionRetryPolicy(recoveryPolicy); _recoveryLoopTask = StartRecoveryLoop(); }
public static double[] GetDelays(IRecoveryPolicy recoveryPolicy) { return(Enumerable.Range(1, 5).Select(x => recoveryPolicy.GetDelay(x).TotalMilliseconds).ToArray()); }