예제 #1
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="concurrencyLimit">The concurrency limit for the subsequent filters in the pipeline</param>
        /// <param name="managementEndpointConfigurator">A management endpoint configurator to support runtime adjustment</param>
        /// <param name="id">An identifier for the concurrency limit to allow selective adjustment</param>
        public static void UseConcurrencyLimit <T>(this IPipeConfigurator <T> configurator, int concurrencyLimit,
                                                   IManagementEndpointConfigurator managementEndpointConfigurator = null, string id = null)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = managementEndpointConfigurator != null
                ? new ConcurrencyLimitPipeSpecification <T>(concurrencyLimit, managementEndpointConfigurator, id)
                : new ConcurrencyLimitPipeSpecification <T>(concurrencyLimit);

            configurator.AddPipeSpecification(specification);
        }
        /// <summary>
        /// Limits the number of concurrent messages consumed on the receive endpoint, regardless of message type.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="concurrentMessageLimit">The concurrency limit for the subsequent filters in the pipeline</param>
        /// <param name="managementEndpointConfigurator">A management endpoint configurator to support runtime adjustment</param>
        /// <param name="id">An identifier for the concurrency limit to allow selective adjustment</param>
        public static void UseConcurrencyLimit(this IConsumePipeConfigurator configurator, int concurrentMessageLimit,
                                               IManagementEndpointConfigurator managementEndpointConfigurator, string id = default)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var observer = new ConcurrencyLimitConfigurationObserver(configurator, concurrentMessageLimit, id);

            managementEndpointConfigurator.Instance(observer.Limiter, x =>
            {
                x.UseConcurrentMessageLimit(1);
                x.Message <SetConcurrencyLimit>(m => m.UseRetry(r => r.None()));
            });
        }
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="concurrencyLimit">The concurrency limit for the subsequent filters in the pipeline</param>
        /// <param name="managementEndpointConfigurator">A management endpoint configurator to support runtime adjustment</param>
        /// <param name="id">An identifier for the concurrency limit to allow selective adjustment</param>
        public static void UseConcurrencyLimit(this IConsumePipeConfigurator configurator, int concurrencyLimit,
                                               IManagementEndpointConfigurator managementEndpointConfigurator, string id = null)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            if (managementEndpointConfigurator != null)
            {
                configurator.AddPrePipeSpecification(new ConcurrencyLimitPipeSpecification <ConsumeContext>(concurrencyLimit, managementEndpointConfigurator, id));
            }
            else
            {
                configurator.AddPrePipeSpecification(new ConcurrencyLimitPipeSpecification <ConsumeContext>(concurrencyLimit));
            }
        }
        /// <summary>
        /// Limits the number of concurrent messages consumed by the saga, regardless of message type.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="concurrentMessageLimit">The concurrent message limit for all message types for the saga</param>
        /// <param name="managementEndpointConfigurator">A management endpoint configurator to support runtime adjustment</param>
        /// <param name="id">An identifier for the concurrency limit to allow selective adjustment</param>
        public static void UseConcurrentMessageLimit <TSaga>(this ISagaConfigurator <TSaga> configurator, int concurrentMessageLimit,
                                                             IManagementEndpointConfigurator managementEndpointConfigurator, string id = null)
            where TSaga : class, ISaga
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var observer = new ConcurrencyLimitSagaConfigurationObserver <TSaga>(configurator, concurrentMessageLimit, id);

            configurator.ConnectSagaConfigurationObserver(observer);

            managementEndpointConfigurator.Instance(observer.Limiter, x =>
            {
                x.UseConcurrentMessageLimit(1);
                x.Message <SetConcurrencyLimit>(m => m.UseRetry(r => r.None()));
            });
        }
        /// <summary>
        /// Limits the number of concurrent messages consumed for the specified message type.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="concurrentMessageLimit">The concurrent message limit for the message type</param>
        /// <param name="managementEndpointConfigurator">A management endpoint configurator to support runtime adjustment</param>
        /// <param name="id">An identifier for the concurrency limit to allow selective adjustment</param>
        public static void UseConcurrentMessageLimit <TMessage>(this IPipeConfigurator <ConsumeContext <TMessage> > configurator, int concurrentMessageLimit,
                                                                IManagementEndpointConfigurator managementEndpointConfigurator, string id = null)
            where TMessage : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var limiter = new ConcurrencyLimiter(concurrentMessageLimit, id);

            var specification = new ConcurrencyLimitConsumePipeSpecification <TMessage>(limiter);

            configurator.AddPipeSpecification(specification);

            managementEndpointConfigurator.Instance(limiter, x =>
            {
                x.UseConcurrentMessageLimit(1);
                x.Message <SetConcurrencyLimit>(m => m.UseRetry(r => r.None()));
            });
        }
예제 #6
0
 protected override void ConfigureBusHost(IRabbitMqBusFactoryConfigurator configurator, IRabbitMqHost host)
 {
     _management = configurator.ManagementEndpoint(host);
 }
        public void ConnectManagementEndpoint(IManagementEndpointConfigurator management)
        {
            var consumer = new SetPrefetchCountManagementConsumer(_mediator, _settings.QueueName);

            management.Instance(consumer);
        }
예제 #8
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            _management = configurator.ManagementEndpoint();

            base.ConfigureInMemoryBus(configurator);
        }
 protected override void ConfigureBusHost(IRabbitMqBusFactoryConfigurator configurator, IRabbitMqHost host)
 {
     _management = configurator.ManagementEndpoint(host);
 }
 public ConcurrencyLimitPipeSpecification(int concurrencyLimit, IManagementEndpointConfigurator configurator, string id = null)
     : this(concurrencyLimit)
 {
     var consumer = new ConcurrencyLimitFilterManagementConsumer(_mediator, id);
     configurator.Instance(consumer);
 }
예제 #11
0
 protected override void ConfigureRabbitMqBusHost(IRabbitMqBusFactoryConfigurator configurator, IRabbitMqHost host)
 {
     _management = configurator.ManagementEndpoint(host);
     _consumerA  = RabbitMqTestHarness.Consumer <TestConsumer>();
 }
        protected override void ConfigureBus(IInMemoryBusFactoryConfigurator configurator)
        {
            _management = configurator.ManagementEndpoint();

            base.ConfigureBus(configurator);
        }
 public void ConnectManagementEndpoint(IManagementEndpointConfigurator management)
 {
     var consumer = new SetPrefetchCountManagementConsumer(_mediator, _settings.QueueName);
     management.Instance(consumer);
 }