/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker, IRebusLoggerFactory rebusLoggerFactory) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; _errorTracker = errorTracker; _log = rebusLoggerFactory.GetCurrentClassLogger(); }
/// <summary> /// Constructs the retry strategy with the given settings, creating an error queue with the configured name if necessary /// </summary> public SimpleRetryStrategy(SimpleRetryStrategySettings simpleRetryStrategySettings, IRebusLoggerFactory rebusLoggerFactory, IErrorTracker errorTracker, IErrorHandler errorHandler, CancellationToken cancellationToken) { _simpleRetryStrategySettings = simpleRetryStrategySettings ?? throw new ArgumentNullException(nameof(simpleRetryStrategySettings)); _rebusLoggerFactory = rebusLoggerFactory ?? throw new ArgumentNullException(nameof(rebusLoggerFactory)); _errorTracker = errorTracker ?? throw new ArgumentNullException(nameof(errorTracker)); _errorHandler = errorHandler ?? throw new ArgumentNullException(nameof(errorHandler)); _cancellationToken = cancellationToken; }
/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; _cleanupOldTrackedErrorsTask = new AsyncTask("CleanupTrackedErrors", CleanupOldTrackedErrors) { Interval = TimeSpan.FromMinutes(1) }; }
/// <summary> /// Constructs the retry strategy with the given settings, creating an error queue with the configured name if necessary /// </summary> public SimpleRetryStrategy(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; var errorQueueAddress = _simpleRetryStrategySettings.ErrorQueueAddress; _transport.CreateQueue(errorQueueAddress); }
/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; _cleanupOldTrackedErrorsTask = new AsyncTask(BackgroundTaskName, CleanupOldTrackedErrors) { Interval = TimeSpan.FromMinutes(1) }; }
/// <summary> /// Creates the error handler /// </summary> public PoisonQueueErrorHandler(SimpleRetryStrategySettings simpleRetryStrategySettings, ITransport transport, IRebusLoggerFactory rebusLoggerFactory) { if (simpleRetryStrategySettings == null) throw new ArgumentNullException(nameof(simpleRetryStrategySettings)); if (transport == null) throw new ArgumentNullException(nameof(transport)); if (rebusLoggerFactory == null) throw new ArgumentNullException(nameof(rebusLoggerFactory)); _simpleRetryStrategySettings = simpleRetryStrategySettings; _transport = transport; _log = rebusLoggerFactory.GetCurrentClassLogger(); }
/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker, IErrorHandler errorHandler) { if (simpleRetryStrategySettings == null) throw new ArgumentNullException(nameof(simpleRetryStrategySettings)); if (errorTracker == null) throw new ArgumentNullException(nameof(errorTracker)); if (errorHandler == null) throw new ArgumentNullException(nameof(errorHandler)); _simpleRetryStrategySettings = simpleRetryStrategySettings; _errorTracker = errorTracker; _errorHandler = errorHandler; }
/// <summary> /// Constructs the retry strategy with the given settings, creating an error queue with the configured name if necessary /// </summary> public SimpleRetryStrategy(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker, IRebusLoggerFactory rebusLoggerFactory) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; _errorTracker = errorTracker; _rebusLoggerFactory = rebusLoggerFactory; var errorQueueAddress = _simpleRetryStrategySettings.ErrorQueueAddress; _transport.CreateQueue(errorQueueAddress); }
/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker, IErrorHandler errorHandler) { if (simpleRetryStrategySettings == null) { throw new ArgumentNullException(nameof(simpleRetryStrategySettings)); } if (errorTracker == null) { throw new ArgumentNullException(nameof(errorTracker)); } if (errorHandler == null) { throw new ArgumentNullException(nameof(errorHandler)); } _simpleRetryStrategySettings = simpleRetryStrategySettings; _errorTracker = errorTracker; _errorHandler = errorHandler; }
/// <summary> /// Configures the simple retry strategy, using the specified error queue address and number of delivery attempts /// </summary> /// <param name="optionsConfigurer">(extension method target)</param> /// <param name="errorQueueAddress">Specifies the name of the error queue</param> /// <param name="maxDeliveryAttempts">Specifies how many delivery attempts should be made before forwarding a failed message to the error queue</param> /// <param name="secondLevelRetriesEnabled">Specifies whether second level retries should be enabled - when enabled, the message will be dispatched wrapped in an <see cref="IFailed{TMessage}"/> after the first <paramref name="maxDeliveryAttempts"/> delivery attempts, allowing a different handler to handle the message. Dispatch of the <see cref="IFailed{TMessage}"/> is subject to the same <paramref name="maxDeliveryAttempts"/> delivery attempts</param> /// <param name="errorDetailsHeaderMaxLength">Specifies a MAX length of the error details to be enclosed as the <see cref="Headers.ErrorDetails"/> header. As the enclosed error details can sometimes become very long (especially when using many delivery attempts), depending on the transport's capabilities it might sometimes be necessary to truncate the error details</param> /// <param name="errorTrackingMaxAgeMinutes">Specifies the max age of in-mem error trackings, for tracked messages that have not had any activity registered on them.</param> public static void SimpleRetryStrategy(this OptionsConfigurer optionsConfigurer, string errorQueueAddress = SimpleRetryStrategySettings.DefaultErrorQueueName, int maxDeliveryAttempts = SimpleRetryStrategySettings.DefaultNumberOfDeliveryAttempts, bool secondLevelRetriesEnabled = false, int errorDetailsHeaderMaxLength = int.MaxValue, int errorTrackingMaxAgeMinutes = SimpleRetryStrategySettings.DefaultErrorTrackingMaxAgeMinutes ) { if (optionsConfigurer == null) { throw new ArgumentNullException(nameof(optionsConfigurer)); } optionsConfigurer.Register(c => { var settings = new SimpleRetryStrategySettings( errorQueueAddress, maxDeliveryAttempts, secondLevelRetriesEnabled, errorDetailsHeaderMaxLength, errorTrackingMaxAgeMinutes ); return(settings); }); if (secondLevelRetriesEnabled) { optionsConfigurer.Decorate <IPipeline>(c => { var pipeline = c.Get <IPipeline>(); var errorTracker = c.Get <IErrorTracker>(); var incomingStep = new FailedMessageWrapperStep(errorTracker); var outgoingStep = new VerifyCannotSendFailedMessageWrapperStep(); return(new PipelineStepInjector(pipeline) .OnReceive(incomingStep, PipelineRelativePosition.After, typeof(DeserializeIncomingMessageStep)) .OnSend(outgoingStep, PipelineRelativePosition.Before, typeof(SerializeOutgoingMessageStep))); }); } }
/// <summary> /// Constructs the step, using the given transport and settings /// </summary> public SimpleRetryStrategyStep(ITransport transport, SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker) { _transport = transport; _simpleRetryStrategySettings = simpleRetryStrategySettings; _errorTracker = errorTracker; }
/// <summary> /// Constructs the retry strategy with the given settings, creating an error queue with the configured name if necessary /// </summary> public SimpleRetryStrategy(SimpleRetryStrategySettings simpleRetryStrategySettings, IErrorTracker errorTracker, IErrorHandler errorHandler) { _simpleRetryStrategySettings = simpleRetryStrategySettings ?? throw new ArgumentNullException(nameof(simpleRetryStrategySettings)); _errorTracker = errorTracker ?? throw new ArgumentNullException(nameof(errorTracker)); _errorHandler = errorHandler ?? throw new ArgumentNullException(nameof(errorHandler)); }