/// <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="partitioner">An existing partitioner that is shared</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        public static void UsePartitioner <T>(this IConsumePipeConfigurator configurator, IPartitioner partitioner, Func <ConsumeContext <T>, Guid> keyProvider)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (partitioner == null)
            {
                throw new ArgumentNullException(nameof(partitioner));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            byte[] Provider(ConsumeContext <T> context)
            {
                return(keyProvider(context).ToByteArray());
            }

            var specification = new PartitionerPipeSpecification <ConsumeContext <T> >(Provider, partitioner);

            configurator.AddPipeSpecification(specification);
        }
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            IFilter <ConsumeContext <TMessage> > filter = new ConductorMessageFilter <TMessage>(_endpoint.GetMessageEndpoint <TMessage>());

            configurator.AddPipeSpecification(new FilterPipeSpecification <ConsumeContext <TMessage> >(filter));
        }
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new ExceptionLoggerSpecification <TMessage>();

            configurator.AddPipeSpecification(specification);
        }
        public InMemoryOutboxConfigurationObserver(IConsumePipeConfigurator configurator, Action <IOutboxConfigurator> configure)
            : base(configurator)
        {
            _configure = configure;

            Connect(this);
        }
Пример #5
0
        public TimeoutConfigurationObserver(IConsumePipeConfigurator configurator, Action <ITimeoutConfigurator> configure)
            : base(configurator)
        {
            _configure = configure;

            Connect(this);
        }
Пример #6
0
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new PartitionMessageSpecification <TMessage>(_partitioner);

            configurator.AddPipeSpecification(specification);
        }
Пример #7
0
        public RetryConfigurationObserver(IConsumePipeConfigurator receiveEndpointConfigurator, Action <IRetryConfigurator> configure)
            : base(receiveEndpointConfigurator)
        {
            _configure = configure;

            Connect(this);
        }
        public ConcurrencyLimitConfigurationObserver(IConsumePipeConfigurator configurator, int concurrentMessageLimit, string id = null)
            : base(configurator)
        {
            Limiter = new ConcurrencyLimiter(concurrentMessageLimit, id);

            Connect(this);
        }
Пример #9
0
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new InMemoryOutboxSpecification <TMessage>();

            configurator.AddPipeSpecification(specification);
        }
Пример #10
0
        public DelayedExchangeRedeliveryConfigurationObserver(IConsumePipeConfigurator configurator, Action <IRetryConfigurator> configure)
            : base(configurator)
        {
            _configure = configure;

            Connect(this);
        }
Пример #11
0
        protected virtual void AddRedeliveryPipeSpecification <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var redeliverySpecification = new ScheduledRedeliveryPipeSpecification <TMessage>();

            configurator.AddPipeSpecification(redeliverySpecification);
        }
        public ServiceEndpointConfigurationObserver(IConsumePipeConfigurator configurator, IServiceEndpoint endpoint)
            : base(configurator)
        {
            _endpoint = endpoint;

            Connect(this);
        }
Пример #13
0
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            IPipeSpecification <ConsumeContext <TMessage> > specification = new MessageDataTransformSpecification <TMessage>(_repository);

            configurator.AddPipeSpecification(specification);
        }
 public ScopedConsumePipeSpecificationObserver(IConsumePipeConfigurator configurator, Type filterType, ILifetimeScopeProvider lifetimeScopeProvider)
     : base(configurator)
 {
     _filterType            = filterType;
     _lifetimeScopeProvider = lifetimeScopeProvider;
     Connect(this);
 }
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new ConcurrencyLimitConsumePipeSpecification <TMessage>(Limiter);

            configurator.AddPipeSpecification(specification);
        }
Пример #16
0
        public PartitionMessageConfigurationObserver(IConsumePipeConfigurator configurator, IPartitioner partitioner)
            : base(configurator)
        {
            _partitioner = partitioner;

            Connect(this);
        }
        public ScheduledRedeliveryConfigurationObserver(IConsumePipeConfigurator configurator, Action <IRetryConfigurator> configure)
            : base(configurator)
        {
            _configure = configure;

            Connect(this);
        }
        public ScopedConsumePipeSpecificationObserver(IConsumePipeConfigurator configurator, Type filterType, IServiceProvider serviceProvider)
            : base(configurator)
        {
            _filterType      = filterType;
            _serviceProvider = serviceProvider;

            Connect(this);
        }
Пример #19
0
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            IPipeSpecification <ConsumeContext <TMessage> > specification = new DiagnosticsActivityPipeSpecification <TMessage>(_diagnosticSource, _activityIdKey,
                                                                                                                                _activityCorrelationContextKey);

            configurator.AddPipeSpecification(specification);
        }
Пример #20
0
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new ApplicationInsightsConsumeSpecification <TMessage>(_telemetryClient, _telemetryHeaderRootKey, _telemetryHeaderParentKey,
                                                                                       _configureOperation);

            configurator.AddPipeSpecification(specification);
        }
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var scopeFilter   = new ScopeMessageFilter <TMessage>(_scopeProvider);
            var specification = new FilterPipeSpecification <ConsumeContext <TMessage> >(scopeFilter);

            configurator.AddPipeSpecification(specification);
        }
        public MessageScopeConfigurationObserver(IConsumePipeConfigurator receiveEndpointConfigurator, IServiceProvider serviceProvider)
            : base(receiveEndpointConfigurator)
        {
            _scopeProvider   = new DependencyInjectionMessageScopeProvider(serviceProvider);
            _serviceProvider = serviceProvider;

            Connect(this);
        }
        /// <summary>
        /// Enable the loading of message data for the specified message type. Message data is large data that is
        /// stored outside of the messaging system.
        /// </summary>
        /// <typeparam name="T">The message type</typeparam>
        /// <param name="configurator"></param>
        /// <param name="repository">The message data repository</param>
        public static void UseMessageData <T>(this IConsumePipeConfigurator configurator, IMessageDataRepository repository)
            where T : class
        {
            var transformConfigurator = new ConsumeTransformSpecification <T>();

            transformConfigurator.LoadMessageData(repository);

            configurator.AddPipeSpecification(transformConfigurator);
        }
Пример #24
0
        /// <summary>
        /// Cancels context's CancellationToken once timeout is reached.
        /// </summary>
        /// <param name="configurator">The pipe configurator</param>
        /// <param name="configure">Configure timeout</param>
        public static void UseTimeout(this IConsumePipeConfigurator configurator, Action <ITimeoutConfigurator> configure = default)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var observer = new TimeoutConfigurationObserver(configurator, configure);
        }
        void ConnectConfigurationObserver(IConsumePipeConfigurator configurator)
        {
            var configurationObserver = new ServiceEndpointConfigurationObserver(configurator, this);

            _configurationHandles.Add(configurator.ConnectConsumerConfigurationObserver(configurationObserver));
            _configurationHandles.Add(configurator.ConnectHandlerConfigurationObserver(configurationObserver));
            _configurationHandles.Add(configurator.ConnectSagaConfigurationObserver(configurationObserver));
            _configurationHandles.Add(configurator.ConnectActivityConfigurationObserver(configurationObserver));
        }
Пример #26
0
        /// <summary>
        /// Includes an outbox in the consume filter path, which delays outgoing messages until the return path
        /// of the pipeline returns to the outbox filter. At this point, the message execution pipeline should be
        /// nearly complete with only the ack remaining. If an exception is thrown, the messages are not sent/published.
        /// </summary>
        /// <param name="configurator">The pipe configurator</param>
        /// <param name="configure">Configure the outbox</param>
        public static void UseInMemoryOutbox(this IConsumePipeConfigurator configurator, Action <IOutboxConfigurator> configure = default)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var observer = new InMemoryOutboxConfigurationObserver(configurator, configure);
        }
        /// <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>
        public static void UseConcurrencyLimit(this IConsumePipeConfigurator configurator, int concurrentMessageLimit)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var observer = new ConcurrencyLimitConfigurationObserver(configurator, concurrentMessageLimit);
        }
        public void MessageConfigured <TMessage>(IConsumePipeConfigurator configurator)
            where TMessage : class
        {
            var specification = new ConsumeContextRetryPipeSpecification <ConsumeContext <TMessage>, RetryConsumeContext <TMessage> >(Factory, _cancellationToken);

            _configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
Пример #29
0
        public void ConfigureServiceEndpoint <T>(IConsumePipeConfigurator configurator)
            where T : class
        {
            var messageCache = ClientCache.GetMessageCache <T>();

            IFilter <ConsumeContext <T> > filter = new ServiceEndpointMessageFilter <T>(messageCache);

            configurator.AddPipeSpecification(new FilterPipeSpecification <ConsumeContext <T> >(filter));
        }
        /// <summary>
        /// Apply a message transform, the behavior of which is defined inline using the configurator
        /// </summary>
        /// <typeparam name="T">The message type</typeparam>
        /// <param name="configurator">The consume pipe configurator</param>
        /// <param name="configure">The configuration callback</param>
        public static void UseTransform <T>(this IConsumePipeConfigurator configurator, Action <ITransformConfigurator <T> > configure)
            where T : class
        {
            var specification = new ConsumeTransformSpecification <T>();

            configure(specification);

            configurator.AddPipeSpecification(specification);
        }