Example #1
0
    /// <summary>
    /// Creates the worker factory
    /// </summary>
    public ThreadPoolWorkerFactory(ITransport transport, IRebusLoggerFactory rebusLoggerFactory,
                                   IPipelineInvoker pipelineInvoker, Options options, Func <RebusBus> busGetter,
                                   BusLifetimeEvents busLifetimeEvents, IBackoffStrategy backoffStrategy, CancellationToken busDisposalCancellationToken)
    {
        if (busLifetimeEvents == null)
        {
            throw new ArgumentNullException(nameof(busLifetimeEvents));
        }
        _transport                    = transport ?? throw new ArgumentNullException(nameof(transport));
        _rebusLoggerFactory           = rebusLoggerFactory ?? throw new ArgumentNullException(nameof(rebusLoggerFactory));
        _pipelineInvoker              = pipelineInvoker ?? throw new ArgumentNullException(nameof(pipelineInvoker));
        _options                      = options ?? throw new ArgumentNullException(nameof(options));
        _busGetter                    = busGetter ?? throw new ArgumentNullException(nameof(busGetter));
        _backoffStrategy              = backoffStrategy ?? throw new ArgumentNullException(nameof(backoffStrategy));
        _busDisposalCancellationToken = busDisposalCancellationToken;
        _parallelOperationsManager    = new ParallelOperationsManager(options.MaxParallelism);
        _log = _rebusLoggerFactory.GetLogger <ThreadPoolWorkerFactory>();

        if (_options.MaxParallelism < 1)
        {
            throw new ArgumentException($"Max parallelism is {_options.MaxParallelism} which is an invalid value");
        }

        if (options.WorkerShutdownTimeout < TimeSpan.Zero)
        {
            throw new ArgumentOutOfRangeException($"Cannot use '{options.WorkerShutdownTimeout}' as worker shutdown timeout as it");
        }

        busLifetimeEvents.WorkersStopped += WaitForContinuationsToFinish;
    }
 public RabbitMQMessageSource(IOptions <RabbitMQMessageSourceOptions> options, IBackoffStrategy backoffStrategy, ILogger <RabbitMQMessageSource> logger)
 {
     this.options         = options.Value;
     this.bus             = RabbitHutch.CreateBus(this.options.ConnectionString, x => x.Register <IScheduler, DelayedExchangeScheduler>());
     this.backoffStrategy = backoffStrategy;
     this.logger          = logger;
 }
        public DefaultRequestExecutor(
            IHttpClient httpClient,
            IClientApiKey apiKey,
            AuthenticationScheme authenticationScheme,
            ILogger logger,
            IBackoffStrategy defaultBackoffStrategy,
            IBackoffStrategy throttlingBackoffStrategy)
        {
            if (!apiKey.IsValid())
            {
                throw new ApplicationException("API Key is invalid.");
            }

            this.httpClient      = httpClient;
            this.syncHttpClient  = httpClient as ISynchronousHttpClient;
            this.asyncHttpClient = httpClient as IAsynchronousHttpClient;

            this.apiKey = apiKey;
            this.authenticationScheme = authenticationScheme;

            IRequestAuthenticatorFactory requestAuthenticatorFactory = new DefaultRequestAuthenticatorFactory();

            this.requestAuthenticator = requestAuthenticatorFactory.Create(authenticationScheme);

            this.logger = logger;
            this.defaultBackoffStrategy    = defaultBackoffStrategy;
            this.throttlingBackoffStrategy = throttlingBackoffStrategy;
        }
 /// <summary>
 /// Constructs the worker factory
 /// </summary>
 public ThreadWorkerFactory(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, int maxParallelism, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory)
 {
     if (transport == null)
     {
         throw new ArgumentNullException(nameof(transport));
     }
     if (pipeline == null)
     {
         throw new ArgumentNullException(nameof(pipeline));
     }
     if (pipelineInvoker == null)
     {
         throw new ArgumentNullException(nameof(pipelineInvoker));
     }
     if (backoffStrategy == null)
     {
         throw new ArgumentNullException(nameof(backoffStrategy));
     }
     if (rebusLoggerFactory == null)
     {
         throw new ArgumentNullException(nameof(rebusLoggerFactory));
     }
     if (maxParallelism <= 0)
     {
         throw new ArgumentOutOfRangeException($"Cannot use value '{maxParallelism}' as max parallelism!");
     }
     _transport                 = transport;
     _pipeline                  = pipeline;
     _pipelineInvoker           = pipelineInvoker;
     _backoffStrategy           = backoffStrategy;
     _rebusLoggerFactory        = rebusLoggerFactory;
     _parallelOperationsManager = new ParallelOperationsManager(maxParallelism);
 }
        public DefaultRequestExecutor(
            IHttpClient httpClient,
            IClientApiKey apiKey,
            AuthenticationScheme authenticationScheme,
            ILogger logger,
            IBackoffStrategy defaultBackoffStrategy,
            IBackoffStrategy throttlingBackoffStrategy)
        {
            if (!apiKey.IsValid())
            {
                throw new ApplicationException("API Key is invalid.");
            }

            this.httpClient = httpClient;
            this.syncHttpClient = httpClient as ISynchronousHttpClient;
            this.asyncHttpClient = httpClient as IAsynchronousHttpClient;

            this.apiKey = apiKey;
            this.authenticationScheme = authenticationScheme;

            IRequestAuthenticatorFactory requestAuthenticatorFactory = new DefaultRequestAuthenticatorFactory();
            this.requestAuthenticator = requestAuthenticatorFactory.Create(authenticationScheme);

            this.logger = logger;
            this.defaultBackoffStrategy = defaultBackoffStrategy;
            this.throttlingBackoffStrategy = throttlingBackoffStrategy;
        }
Example #6
0
 public ExternalTaskTopicManager(string workerId, ExternalTaskService externalTaskService,
                                 ExternalTaskTopicManagerInfo taskManagerInfo, IBackoffStrategy backoffStrategy, IPolicyManager policyManager)
 {
     this.workerId            = workerId;
     this.externalTaskService = externalTaskService;
     this.topicManagerInfo    = taskManagerInfo;
     this.backoffStrategy     = backoffStrategy;
     this.policyManager       = policyManager;
 }
 public OutboxMessagesProcessor(int topMessagesToRetrieve, ITransport transport, IOutboxStorage outboxStorage, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory, CancellationToken busDisposalCancellationToken)
 {
     _topMessagesToRetrieve        = topMessagesToRetrieve;
     _transport                    = transport;
     _outboxStorage                = outboxStorage;
     _backoffStrategy              = backoffStrategy;
     _busDisposalCancellationToken = busDisposalCancellationToken;
     _log = rebusLoggerFactory.GetLogger <OutboxMessagesProcessor>();
 }
 public OutboxMessageProcessorTests()
 {
     _transport       = Substitute.For <ITransport>();
     _outboxStorage   = Substitute.For <IOutboxStorage>();
     _backoffStrategy = Substitute.For <IBackoffStrategy>();
     _busDisposalCancellationTokenSource = new CancellationTokenSource();
     _processor = new OutboxMessagesProcessor(TopMessagesToRetrieve, _transport, _outboxStorage,
                                              _backoffStrategy, new NullLoggerFactory(), _busDisposalCancellationTokenSource.Token);
 }
Example #9
0
        public JitterStrategyTests()
        {
            _constantStrategy = new ConstantBackoffStrategy(_waitTime);

            _minRandomNumberGenerator = new MinConstantRandomNumberGenerator();
            _maxRandomNumberGenerator = new MaxConstantRandomNumberGenerator();

            rangeOfError = 1 - (1 - _maxRandomNumberGenerator.NextDouble()) * 10; // Let's be generous with our buffer.
        }
Example #10
0
        public CappedBackoffStrategy(IBackoffStrategy strategy, TimeSpan maxWaitTime)
        {
            if (maxWaitTime < TimeSpan.Zero)
            {
                throw new ArgumentException("The maximum wait time cannot be less than zero.", nameof(maxWaitTime));
            }

            _strategy    = strategy ?? throw new ArgumentNullException(nameof(strategy));
            _maxWaitTime = maxWaitTime;
        }
Example #11
0
        public void NullStrategyThrowsExceptionForAConstantAdjustment()
        {
            IBackoffStrategy       decoratedStrategy     = null;
            IRandomNumberGenerator randomNumberGenerator = new DefaultRandomNumberGenerator();

            Assert.Throws <ArgumentNullException>(() =>
            {
                new ConstantAdjustedBackoffStrategy(decoratedStrategy, TimeSpan.Zero);
            });
        }
Example #12
0
        public void NullStrategyThrowsExceptionForAPercentageAdjustment()
        {
            IBackoffStrategy       decoratedStrategy     = null;
            IRandomNumberGenerator randomNumberGenerator = new DefaultRandomNumberGenerator();

            Assert.Throws <ArgumentNullException>(() =>
            {
                new PercentageAdjustedBackoffStrategy(decoratedStrategy, 1);
            });
        }
Example #13
0
        public void NullStrategyThrowsException()
        {
            IBackoffStrategy       decoratedStrategy     = null;
            IRandomNumberGenerator randomNumberGenerator = new DefaultRandomNumberGenerator();

            Assert.Throws <ArgumentNullException>(() =>
            {
                new MultiplicativeJitterBackoffStrategy(decoratedStrategy, 0, 1);
            });
        }
        public NsqTcpConnection(DnsEndPoint endPoint, ConsumerOptions options, IBackoffStrategy backoffStrategy)
        {
            _endPoint = endPoint;
            _options = options;
            _backoffStrategy = backoffStrategy;

            _connectionClosedSource = new CancellationTokenSource();

            _workerThread = new Thread(WorkerLoop);
            _workerThread.Name = "Turbocharged.NSQ Worker";
        }
Example #15
0
        public NsqTcpConnection(DnsEndPoint endPoint, ConsumerOptions options, IBackoffStrategy backoffStrategy)
        {
            EndPoint         = endPoint;
            _options         = options;
            _backoffStrategy = backoffStrategy;

            _connectionClosedSource = new CancellationTokenSource();

            _workerThread      = new Thread(WorkerLoop);
            _workerThread.Name = "NSQCore Worker";
        }
Example #16
0
        public ConstantAdjustedBackoffStrategy(IBackoffStrategy strategy, TimeSpan adjustment)
        {
            _strategy = strategy ?? throw new ArgumentNullException(nameof(strategy));

            if (adjustment + strategy.InitialWaitTime < TimeSpan.Zero)
            {
                throw new ArgumentException("A negative adjustment cannot result in a wait time less than zero.", nameof(adjustment));
            }

            _adjustment = adjustment;
        }
Example #17
0
 public MessageReaderFactory(IRebusLoggerFactory rebusLoggerFactory,
                             RebusBus owningBus,
                             ITransport transport,
                             IPipelineInvoker pipelineInvoker,
                             IBackoffStrategy backoffStrategy)
 {
     this._log        = rebusLoggerFactory.GetLogger <RebusMessageReader>();
     _transport       = transport;
     _pipelineInvoker = pipelineInvoker;
     _owningBus       = owningBus;
     _backoffStrategy = backoffStrategy;
 }
        private static IRequestExecutor GetRequestExecutor(IHttpClient client, IBackoffStrategy defaultStrategy = null, IBackoffStrategy throttlingStrategy = null)
        {
            var defaultBackoffStrategy    = defaultStrategy ?? GetFakeBackoffStrategy();
            var throttlingBackoffStrategy = throttlingStrategy ?? GetFakeBackoffStrategy();

            return(new DefaultRequestExecutor(
                       client,
                       FakeApiKey.Create(valid: true),
                       AuthenticationScheme.Basic,
                       Substitute.For <ILogger>(),
                       defaultBackoffStrategy,
                       throttlingBackoffStrategy));
        }
        public PercentageAdjustedBackoffStrategy(IBackoffStrategy strategy, double percentageAdjustment)
        {
            _strategy = strategy ?? throw new ArgumentNullException(nameof(strategy));

            // Prevent violations of causality. Current systems executing this code don't have this problem,
            // but who knows what system this will run on in the future.
            if (percentageAdjustment < 0)
            {
                throw new ArgumentException("A negative percentage will result in a negative wait time and is not allowed.", nameof(percentageAdjustment));
            }

            _percentageAdjustment = percentageAdjustment;
        }
Example #20
0
 public RebusOutboxProcessor(
     int topMessagesToRetrieve,
     ITransport transport,
     IBackoffStrategy backoffStrategy,
     IRebusLoggerFactory rebusLoggerFactory,
     IOutboxContextFactory outboxContextFactory)
 {
     _topMessagesToRetrieve = topMessagesToRetrieve;
     _transport             = transport;
     _backoffStrategy       = backoffStrategy;
     _outboxContextFactory  = outboxContextFactory;
     _log = rebusLoggerFactory.GetLogger <RebusOutboxProcessor>();
 }
        private static IRequestExecutor GetRequestExecutor(IHttpClient client, IBackoffStrategy defaultStrategy = null, IBackoffStrategy throttlingStrategy = null)
        {
            var defaultBackoffStrategy = defaultStrategy ?? GetFakeBackoffStrategy();
            var throttlingBackoffStrategy = throttlingStrategy ?? GetFakeBackoffStrategy();

            return new DefaultRequestExecutor(
                client,
                FakeApiKey.Create(valid: true),
                AuthenticationScheme.Basic,
                Substitute.For<ILogger>(),
                defaultBackoffStrategy,
                throttlingBackoffStrategy);
        }
Example #22
0
        /// <summary>
        /// Constructs the TPL worker factory
        /// </summary>
        public TplWorkerFactory(ITransport transport, IRebusLoggerFactory rebusLoggerFactory, IPipelineInvoker pipelineInvoker, Options options, Func <RebusBus> busGetter, BusLifetimeEvents busLifetimeEvents, IBackoffStrategy backoffStrategy, CancellationToken busDisposalCancellationToken)
        {
            _transport                    = transport;
            _rebusLoggerFactory           = rebusLoggerFactory;
            _pipelineInvoker              = pipelineInvoker;
            _options                      = options;
            _busGetter                    = busGetter;
            _backoffStrategy              = backoffStrategy;
            _busDisposalCancellationToken = busDisposalCancellationToken;
            _parallelOperationsManager    = new ParallelOperationsManager(options.MaxParallelism);
            _log = _rebusLoggerFactory.GetLogger <TplWorkerFactory>();

            busLifetimeEvents.WorkersStopped += WaitForContinuationsToFinish;
        }
Example #23
0
 /// <summary>
 /// Constructs the worker factory
 /// </summary>
 public ThreadWorkerFactory(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, int maxParallelism, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory)
 {
     if (transport == null) throw new ArgumentNullException("transport");
     if (pipeline == null) throw new ArgumentNullException("pipeline");
     if (pipelineInvoker == null) throw new ArgumentNullException("pipelineInvoker");
     if (backoffStrategy == null) throw new ArgumentNullException("backoffStrategy");
     if (rebusLoggerFactory == null) throw new ArgumentNullException("rebusLoggerFactory");
     if (maxParallelism <= 0) throw new ArgumentOutOfRangeException(string.Format("Cannot use value '{0}' as max parallelism!", maxParallelism));
     _transport = transport;
     _pipeline = pipeline;
     _pipelineInvoker = pipelineInvoker;
     _backoffStrategy = backoffStrategy;
     _rebusLoggerFactory = rebusLoggerFactory;
     _parallelOperationsManager = new ParallelOperationsManager(maxParallelism);
 }
Example #24
0
 public RebusMessageReader(long taskId,
                           ITaskCoordinatorAdvanced tasksCoordinator,
                           ILog log,
                           ITransport transport,
                           IBackoffStrategy backoffStrategy,
                           IPipelineInvoker pipelineInvoker,
                           RebusBus owningBus
                           ) :
     base(taskId, tasksCoordinator, log)
 {
     _transport       = transport;
     _pipelineInvoker = pipelineInvoker;
     _owningBus       = owningBus;
     _backoffStrategy = backoffStrategy;
 }
Example #25
0
        public TplWorker(string workerName, RebusBus owningBus, ITransport transport, IRebusLoggerFactory rebusLoggerFactory, IPipelineInvoker pipelineInvoker, ParallelOperationsManager parallelOperationsManager, Options options, IBackoffStrategy backoffStrategy)
        {
            _owningBus                 = owningBus;
            _transport                 = transport;
            _pipelineInvoker           = pipelineInvoker;
            _parallelOperationsManager = parallelOperationsManager;
            _options         = options;
            _backoffStrategy = backoffStrategy;
            Name             = workerName;

            _cancellationToken = _cancellationTokenSource.Token;
            _log = rebusLoggerFactory.GetLogger <TplWorker>();

            Task.Run(Run);
        }
Example #26
0
        /// <summary>
        /// Creates the worker factory
        /// </summary>
        public WorkersCoordinatorFactory(ITransport transport, IRebusLoggerFactory rebusLoggerFactory, IPipelineInvoker pipelineInvoker, Options options, Func <RebusBus> busGetter, BusLifetimeEvents busLifetimeEvents, IBackoffStrategy backoffStrategy)
        {
            if (transport == null)
            {
                throw new ArgumentNullException(nameof(transport));
            }
            if (rebusLoggerFactory == null)
            {
                throw new ArgumentNullException(nameof(rebusLoggerFactory));
            }
            if (pipelineInvoker == null)
            {
                throw new ArgumentNullException(nameof(pipelineInvoker));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (busGetter == null)
            {
                throw new ArgumentNullException(nameof(busGetter));
            }
            if (busLifetimeEvents == null)
            {
                throw new ArgumentNullException(nameof(busLifetimeEvents));
            }
            if (backoffStrategy == null)
            {
                throw new ArgumentNullException(nameof(backoffStrategy));
            }
            _transport          = transport;
            _rebusLoggerFactory = rebusLoggerFactory;
            _pipelineInvoker    = pipelineInvoker;
            _options            = options;
            _busGetter          = busGetter;
            _backoffStrategy    = backoffStrategy;
            _log = _rebusLoggerFactory.GetLogger <WorkersCoordinatorFactory>();

            if (_options.MaxReadParallelism < 1)
            {
                throw new ArgumentException($"Max read parallelism is {_options.MaxReadParallelism} which is an invalid value");
            }

            if (options.WorkerShutdownTimeout < TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException($"Cannot use '{options.WorkerShutdownTimeout}' as worker shutdown timeout as it");
            }
        }
Example #27
0
        internal ThreadWorker(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, string workerName, ThreadWorkerSynchronizationContext threadWorkerSynchronizationContext, ParallelOperationsManager parallelOperationsManager, IBackoffStrategy backoffStrategy)
        {
            Name = workerName;

            _transport = transport;
            _pipeline = pipeline;
            _pipelineInvoker = pipelineInvoker;
            _threadWorkerSynchronizationContext = threadWorkerSynchronizationContext;
            _parallelOperationsManager = parallelOperationsManager;
            _backoffStrategy = backoffStrategy;
            _workerThread = new Thread(ThreadStart)
            {
                Name = workerName,
                IsBackground = true
            };
            _workerThread.Start();
        }
Example #28
0
 internal ThreadPoolWorker(string name, ITransport transport, IRebusLoggerFactory rebusLoggerFactory, IPipelineInvoker pipelineInvoker, ParallelOperationsManager parallelOperationsManager, RebusBus owningBus, Options options, IBackoffStrategy backoffStrategy)
 {
     Name                       = name;
     _log                       = rebusLoggerFactory.GetLogger <ThreadPoolWorker>();
     _transport                 = transport;
     _pipelineInvoker           = pipelineInvoker;
     _parallelOperationsManager = parallelOperationsManager;
     _owningBus                 = owningBus;
     _options                   = options;
     _backoffStrategy           = backoffStrategy;
     _workerThread              = new Thread(Run)
     {
         Name         = name,
         IsBackground = true
     };
     _workerThread.Start();
 }
Example #29
0
        /// <summary>
        /// Constructs the worker factory
        /// </summary>
        public ThreadWorkerFactory(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory, Options options, Func <RebusBus> busGetter)
        {
            if (transport == null)
            {
                throw new ArgumentNullException(nameof(transport));
            }
            if (pipeline == null)
            {
                throw new ArgumentNullException(nameof(pipeline));
            }
            if (pipelineInvoker == null)
            {
                throw new ArgumentNullException(nameof(pipelineInvoker));
            }
            if (backoffStrategy == null)
            {
                throw new ArgumentNullException(nameof(backoffStrategy));
            }
            if (rebusLoggerFactory == null)
            {
                throw new ArgumentNullException(nameof(rebusLoggerFactory));
            }

            var maxParallelism = options.MaxParallelism;

            if (maxParallelism <= 0)
            {
                throw new ArgumentOutOfRangeException($"Cannot use value '{maxParallelism}' as setting for max parallelism as it must be a positive number");
            }

            var workerShutdownTimeout = options.WorkerShutdownTimeout;

            if (workerShutdownTimeout < TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException($"Cannot use '{workerShutdownTimeout}' as worker shutdown timeout as it");
            }

            _transport                 = transport;
            _pipeline                  = pipeline;
            _pipelineInvoker           = pipelineInvoker;
            _backoffStrategy           = backoffStrategy;
            _rebusLoggerFactory        = rebusLoggerFactory;
            _busGetter                 = busGetter;
            _parallelOperationsManager = new ParallelOperationsManager(maxParallelism);
            _workerShutdownTimeout     = workerShutdownTimeout;
        }
 public MultiplicativeJitterBackoffStrategy(IBackoffStrategy strategy, double minMultiplier, double maxMultiplier)
 {
     _strategy     = strategy ?? throw new ArgumentNullException(nameof(strategy));
     MinMultiplier = minMultiplier;
     MaxMultiplier = maxMultiplier;
     if (minMultiplier < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(minMultiplier), "Must be greater than or equal to 0");
     }
     if (maxMultiplier <= 0)
     {
         throw new ArgumentOutOfRangeException(nameof(maxMultiplier), "Must be greater than 0");
     }
     if (minMultiplier > maxMultiplier)
     {
         throw new ArgumentOutOfRangeException(nameof(maxMultiplier), $"Max multiplier should be greater than {nameof(minMultiplier)}");
     }
 }
Example #31
0
        /// <summary>
        /// Constructs the worker factory
        /// </summary>
        public ThreadWorkerFactory(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, int maxParallelism, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory, TimeSpan workerShutdownTimeout)
        {
            if (transport == null) throw new ArgumentNullException(nameof(transport));
            if (pipeline == null) throw new ArgumentNullException(nameof(pipeline));
            if (pipelineInvoker == null) throw new ArgumentNullException(nameof(pipelineInvoker));
            if (backoffStrategy == null) throw new ArgumentNullException(nameof(backoffStrategy));
            if (rebusLoggerFactory == null) throw new ArgumentNullException(nameof(rebusLoggerFactory));
            if (maxParallelism <= 0) throw new ArgumentOutOfRangeException($"Cannot use value '{maxParallelism}' as max parallelism!");
            if (workerShutdownTimeout == null) throw new ArgumentNullException(nameof(workerShutdownTimeout));

            _transport = transport;
            _pipeline = pipeline;
            _pipelineInvoker = pipelineInvoker;
            _backoffStrategy = backoffStrategy;
            _rebusLoggerFactory = rebusLoggerFactory;
            _parallelOperationsManager = new ParallelOperationsManager(maxParallelism);
            _workerShutdownTimeout = workerShutdownTimeout;
        }
Example #32
0
        internal ThreadWorker(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, string workerName, ThreadWorkerSynchronizationContext threadWorkerSynchronizationContext, ParallelOperationsManager parallelOperationsManager, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory)
        {
            Name = workerName;

            _log             = rebusLoggerFactory.GetCurrentClassLogger();
            _transport       = transport;
            _pipeline        = pipeline;
            _pipelineInvoker = pipelineInvoker;
            _threadWorkerSynchronizationContext = threadWorkerSynchronizationContext;
            _parallelOperationsManager          = parallelOperationsManager;
            _backoffStrategy = backoffStrategy;
            _workerThread    = new Thread(ThreadStart)
            {
                Name         = workerName,
                IsBackground = true,
            };
            _workerThread.Start();
        }
Example #33
0
        private void TestBackoffMaxLevel(IBackoffStrategy backoffStrategy)
        {
            for (var maxBackoff = 0; maxBackoff <= 16; maxBackoff++)
            {
                for (var multiplier = 1; multiplier <= 16; multiplier++)
                {
                    var config = new NsqConfig
                    {
                        MaxBackoffDuration = TimeSpan.FromMilliseconds(maxBackoff),
                        BackoffMultiplier  = TimeSpan.FromMilliseconds(multiplier)
                    };
                    config.Validate();

                    var expectedMaxLevel = 1;
                    if (maxBackoff != 0 && multiplier != 0)
                    {
                        var x = config.MaxBackoffDuration.TotalSeconds / config.BackoffMultiplier.TotalSeconds;
                        expectedMaxLevel = (int)Math.Ceiling(Math.Log(x, 2)) + 1;
                        if (expectedMaxLevel <= 0)
                        {
                            expectedMaxLevel = 1;
                        }
                    }

                    bool increaseBackoffLevel;
                    if (expectedMaxLevel > 1)
                    {
                        increaseBackoffLevel = backoffStrategy.Calculate(config, expectedMaxLevel - 1).IncreaseBackoffLevel;

                        Assert.IsTrue(increaseBackoffLevel,
                                      string.Format("increaseBackoff max={0} multiplier={1} level={2} expectedMaxLevel={3}",
                                                    config.MaxBackoffDuration, config.BackoffMultiplier, expectedMaxLevel - 1,
                                                    expectedMaxLevel));
                    }

                    increaseBackoffLevel = backoffStrategy.Calculate(config, expectedMaxLevel).IncreaseBackoffLevel;

                    Assert.IsFalse(increaseBackoffLevel,
                                   string.Format("increaseBackoff max={0} multiplier={1} level={2} expectedMaxLevel={3}",
                                                 config.MaxBackoffDuration, config.BackoffMultiplier, expectedMaxLevel, expectedMaxLevel));
                }
            }
        }
Example #34
0
        internal ThreadWorker(ITransport transport, IPipeline pipeline, IPipelineInvoker pipelineInvoker, string workerName, ThreadWorkerSynchronizationContext threadWorkerSynchronizationContext, ParallelOperationsManager parallelOperationsManager, IBackoffStrategy backoffStrategy, IRebusLoggerFactory rebusLoggerFactory, TimeSpan workerShutdownTimeout)
        {
            Name = workerName;

            _log = rebusLoggerFactory.GetCurrentClassLogger();
            _transport = transport;
            _pipeline = pipeline;
            _pipelineInvoker = pipelineInvoker;
            _threadWorkerSynchronizationContext = threadWorkerSynchronizationContext;
            _parallelOperationsManager = parallelOperationsManager;
            _backoffStrategy = backoffStrategy;
            _workerShutdownTimeout = workerShutdownTimeout;
            _workerThread = new Thread(ThreadStart)
            {
                Name = workerName,
                IsBackground = true,
            };
            _workerThread.Start();
        }
Example #35
0
 /// <summary>
 /// Sets the backoff strategy of the retry policy. If not called, the default
 /// <see cref="ExponentBackoffStrategy"/> would be used.
 /// </summary>
 /// <param name="backoffStrategy">The backoff strategy.</param>
 /// <returns>The builder instance.</returns>
 public RetryPolicyBuilder WithBackoffStrategy(IBackoffStrategy backoffStrategy)
 {
     this.backoffStrategy = backoffStrategy;
     return(this);
 }
Example #36
0
 internal RetryPolicyBuilder()
 {
     this.maxRetries      = DefaultMaxRetries;
     this.backoffStrategy = DefaultBackoffStrategy;
 }
Example #37
0
 public DefaultPolicyManager(IBackoffStrategy backoffStrategy, string topicName)
 {
     this.backoffStrategy = backoffStrategy;
     this.topicName       = topicName;
 }