示例#1
0
        /// <summary>
        /// Adds a RabbitMQ Basic Consumer to the pipeline
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="pipe"></param>
        /// <param name="settings"></param>
        /// <param name="receiveObserver"></param>
        /// <param name="transportObserver"></param>
        /// <param name="supervisor"></param>
        /// <param name="managementPipe"></param>
        /// <param name="host"></param>
        /// <param name="topology"></param>
        public static void RabbitMqConsumer(this IPipeConfigurator <ConnectionContext> configurator, IPipe <ReceiveContext> pipe, ReceiveSettings settings,
                                            IReceiveObserver receiveObserver, IReceiveTransportObserver transportObserver, ITaskSupervisor supervisor, IManagementPipe managementPipe,
                                            IRabbitMqHost host, IRabbitMqReceiveEndpointTopology topology)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new RabbitMqConsumerPipeSpecification(pipe, settings, receiveObserver, transportObserver,
                                                                                supervisor, managementPipe, host, topology);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
示例#2
0
        /// <summary>
        /// Adds a filter to the pipe which is of a different type than the native pipe context type
        /// </summary>
        /// <typeparam name="TContext">The context type</typeparam>
        /// <typeparam name="TFilter">The filter context type</typeparam>
        /// <param name="configurator">The pipe configurator</param>
        /// <param name="filter">The filter to add</param>
        /// <param name="contextProvider"></param>
        /// <param name="inputContextProvider"></param>
        public static void UseFilter <TContext, TFilter>(this IPipeConfigurator <TContext> configurator, IFilter <TFilter> filter,
                                                         MergeFilterContextProvider <TContext, TFilter> contextProvider, FilterContextProvider <TFilter, TContext> inputContextProvider)
            where TContext : class, TFilter
            where TFilter : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new FilterPipeSpecification <TContext, TFilter>(filter, contextProvider, inputContextProvider);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
示例#3
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 <T>(this IPipeConfigurator <ConsumeContext <T> > configurator, Action <IOutboxConfigurator> configure = default)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new InMemoryOutboxSpecification <T>();

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
        /// <summary>
        /// Configure a pipeline for specific command type
        /// </summary>
        /// <param name="configurator">Commands pipeline configurator</param>
        /// <param name="configure">Delegate for configure pipeline</param>
        /// <typeparam name="TCommand">Command type</typeparam>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="configure"/> is null</exception>
        public static void UseForCommand <TCommand>(
            this IPipeConfigurator <ICommandHandlingContext> configurator,
            Action <IPipeConfigurator <ICommandHandlingContext <TCommand> > > configure)
            where TCommand : ICommand
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            configurator.UseRouteFor(
                context => context is ICommandHandlingContext <TCommand>,
                configure);
        }
        /// <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>
        public static void UseConcurrentMessageLimit <TMessage>(this IPipeConfigurator <ConsumeContext <TMessage> > configurator, int concurrentMessageLimit)
            where TMessage : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var limiter = new ConcurrencyLimiter(concurrentMessageLimit);

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

            configurator.AddPipeSpecification(specification);
        }
        /// <summary>
        /// Rescue exceptions via the alternate pipe
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="rescuePipe"></param>
        /// <param name="configure"></param>
        public static void UseRescue(this IPipeConfigurator <ConsumeContext> configurator, IPipe <ExceptionConsumeContext> rescuePipe,
                                     Action <IExceptionConfigurator> configure = null)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var rescueConfigurator = new ConsumeContextRescuePipeSpecification(rescuePipe);

            configure?.Invoke(rescueConfigurator);

            configurator.AddPipeSpecification(rescueConfigurator);
        }
示例#7
0
        /// <summary>
        /// Configure a pipeline for specific query type
        /// </summary>
        /// <param name="configurator">Queries pipeline configurator</param>
        /// <param name="configure">Delegate for configure pipeline</param>
        /// <typeparam name="TQuery">Query type</typeparam>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="configure"/> is null</exception>
        public static void UseForQuery <TQuery>(
            this IPipeConfigurator <IQueryHandlingContext> configurator,
            Action <IPipeConfigurator <IQueryHandlingContext <TQuery> > > configure)
            where TQuery : IQuery
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            configurator.UseRouteFor(
                context => context is IQueryHandlingContext <TQuery>,
                configure);
        }
        /// <summary>
        /// Adds a filter to the pipe
        /// </summary>
        /// <typeparam name="T">The context type</typeparam>
        /// <typeparam name="TConsumer"></typeparam>
        /// <param name="configurator">The pipe configurator</param>
        /// <param name="filter">The already built pipe</param>
        public static void UseFilter <TConsumer, T>(this IPipeConfigurator <ConsumerConsumeContext <TConsumer, T> > configurator,
                                                    IFilter <ConsumerConsumeContext <TConsumer> > filter)
            where T : class
            where TConsumer : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new ConsumerFilterSpecification <TConsumer, T>(filter);

            configurator.AddPipeSpecification(specification);
        }
示例#9
0
        public static void UseRetry <TSaga>(this IPipeConfigurator <SagaConsumeContext <TSaga> > configurator, Action <IRetryConfigurator> configure)
            where TSaga : class, ISaga
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new ConsumeContextRetryPipeSpecification <SagaConsumeContext <TSaga>, RetrySagaConsumeContext <TSaga> >(Factory);

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
示例#10
0
        /// <summary>
        /// Adds a latest value filter to the pipe
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="configure"></param>
        public static void UseLatest <T>(this IPipeConfigurator <T> configurator, Action <ILatestConfigurator <T> > configure = null)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new LatestPipeSpecification <T>();

            configure?.Invoke(pipeBuilderConfigurator);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
示例#11
0
        public static void UseRetry <T>(this IPipeConfigurator <ConsumeContext <T> > configurator, IRetryPolicy retryPolicy)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new ConsumeContextRetryPipeSpecification <ConsumeContext <T>, RetryConsumeContext <T> >(Factory);

            specification.SetRetryPolicy(x => retryPolicy);

            configurator.AddPipeSpecification(specification);
        }
        /// <summary>
        /// Adds a filter to the pipe
        /// </summary>
        /// <typeparam name="T">The context type</typeparam>
        /// <typeparam name="TSaga"></typeparam>
        /// <param name="configurator">The pipe configurator</param>
        /// <param name="filter">The already built pipe</param>
        public static void Filter <TSaga, T>(this IPipeConfigurator <SagaConsumeContext <TSaga, T> > configurator,
                                             IFilter <SagaConsumeContext <TSaga> > filter)
            where T : class
            where TSaga : class, ISaga
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new SagaFilterSpecification <TSaga, T>(filter);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
示例#13
0
        /// <summary>
        /// Adds a RabbitMQ Basic Consumer to the pipeline
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="pipe"></param>
        /// <param name="settings"></param>
        /// <param name="receiveObserver"></param>
        /// <param name="endpointObserver"></param>
        /// <param name="exchangeBindings"></param>
        /// <param name="supervisor"></param>
        /// <param name="mediator"></param>
        public static void RabbitMqConsumer(this IPipeConfigurator <ConnectionContext> configurator, IPipe <ReceiveContext> pipe, ReceiveSettings settings,
                                            IReceiveObserver receiveObserver, IReceiveEndpointObserver endpointObserver, IEnumerable <ExchangeBindingSettings> exchangeBindings,
                                            ITaskSupervisor supervisor, Mediator <ISetPrefetchCount> mediator)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new RabbitMqConsumerPipeSpecification(pipe, settings, receiveObserver, endpointObserver, exchangeBindings,
                                                                                supervisor, mediator);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
        public static void UseRetry <T>(this IPipeConfigurator <ConsumeContext <T> > configurator, Action <IRetryConfigurator> configure)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new ConsumeContextRetryPipeSpecification <ConsumeContext <T>, RetryConsumeContext <T> >((x, r) => new RetryConsumeContext <T>(x, r));

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
        /// <summary>
        /// Puts a circuit breaker in the pipe, which can automatically prevent the flow of messages to the consumer
        /// when the circuit breaker is opened.
        /// </summary>
        /// <typeparam name="T">The pipe context type</typeparam>
        /// <param name="configurator"></param>
        /// <param name="configure"></param>
        public static void UseCircuitBreaker <T>(this IPipeConfigurator <T> configurator, Action <ICircuitBreakerConfigurator <T> > configure = null)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new CircuitBreakerPipeSpecification <T>();

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
示例#16
0
        /// <summary>
        /// Adds a dispatch filter to the pipe, which can be used to route traffic
        /// based on the type of the incoming context
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="pipeContextProviderFactory"></param>
        /// <param name="configure"></param>
        public static void UseDispatch <T>(this IPipeConfigurator <T> configurator, IPipeContextConverterFactory <T> pipeContextProviderFactory,
                                           Action <IDispatchConfigurator <T> > configure = null)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new DispatchPipeSpecification <T>(pipeContextProviderFactory);

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
示例#17
0
        /// <summary>
        /// Configures the query handling pipeline
        /// </summary>
        private static void QueriesHandlingConfiguration(
            IServiceProvider provider,
            IPipeConfigurator <IQueryHandlingContext> cfg)
        {
            //Using standard CqrsVibe filters

            //Using middleware feature. Resolves middleware instance and insert calling into pipeline
            cfg.Use <SomeQueriesMiddleware>();

            //Configures and insert pipeline for SomeQuery
            cfg.UseForQuery <SomeQuery>(configurator =>
            {
                //Configuring pipeline
            });
        }
        /// <summary>
        /// Adds a RabbitMQ Basic Consumer to the pipeline
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="receivePipe"></param>
        /// <param name="settings"></param>
        /// <param name="receiveSettings"></param>
        /// <param name="receiveObserver"></param>
        /// <param name="receiveTransportObserver"></param>
        /// <param name="supervisor"></param>
        /// <param name="sendPipe"></param>
        public static void HttpConsumer(this IPipeConfigurator <OwinHostContext> configurator, IPipe <ReceiveContext> receivePipe, HttpHostSettings settings,
                                        ReceiveSettings receiveSettings,
                                        IReceiveObserver receiveObserver, IReceiveTransportObserver receiveTransportObserver, ITaskSupervisor supervisor,
                                        ISendPipe sendPipe)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var pipeBuilderConfigurator = new HttpConsumerPipeSpecification(settings, receiveSettings, receivePipe, receiveObserver, receiveTransportObserver,
                                                                            supervisor, sendPipe);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
        /// <summary>
        /// Rescue exceptions via the alternate pipe
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="rescuePipe"></param>
        /// <param name="configure"></param>
        public static void UseRescue <T>(this IPipeConfigurator <SagaConsumeContext <T> > configurator, IPipe <ExceptionSagaConsumeContext <T> > rescuePipe,
                                         Action <IExceptionConfigurator> configure = null)
            where T : class, ISaga
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var rescueConfigurator = new SagaConsumeContextRescuePipeSpecification <T>(rescuePipe);

            configure?.Invoke(rescueConfigurator);

            configurator.AddPipeSpecification(rescueConfigurator);
        }
示例#20
0
        public static void UseSerilog <TContext>(
            this IPipeConfigurator <TContext> configurator,
            LogEventLevel logAsLevel            = LogEventLevel.Information,
            ILogger logger                      = null,
            Func <TContext, bool> shouldExecute = null)
            where TContext : IContext <IMessage>
        {
            if (logger == null && configurator.DependencyScope == null)
            {
                throw new DependencyScopeNotConfiguredException($"{nameof(ILogger)} is not provided and IDependencyScope is not configured, Please ensure {nameof(ILogger)} is registered properly if you are using IoC container, otherwise please pass {nameof(ILogger)} as parameter");
            }
            logger = logger ?? configurator.DependencyScope.Resolve <ILogger>();

            configurator.AddPipeSpecification(new SerilogMiddlewareSpecification <TContext>(logger, logAsLevel, shouldExecute));
        }
        public static void UseRetry <TSaga>(this IPipeConfigurator <SagaConsumeContext <TSaga> > configurator, IRetryPolicy retryPolicy)
            where TSaga : class, ISaga
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification =
                new ConsumeContextRetryPipeSpecification <SagaConsumeContext <TSaga>, RetrySagaConsumeContext <TSaga> >((x, r) => new RetrySagaConsumeContext <TSaga>(x, r));

            specification.SetRetryPolicy(x => retryPolicy);

            configurator.AddPipeSpecification(specification);
        }
示例#22
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);
        }
示例#23
0
        /// <summary>
        /// Rescue exceptions via the alternate pipe
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TRescue"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="rescuePipe"></param>
        /// <param name="rescueContextFactory">Factory method to convert the pipe context to the rescue pipe context</param>
        /// <param name="configure"></param>
        public static void UseRescue <T, TRescue>(this IPipeConfigurator <T> configurator, IPipe <TRescue> rescuePipe,
                                                  RescueContextFactory <T, TRescue> rescueContextFactory, Action <IRescueConfigurator> configure = null)
            where T : class, PipeContext
            where TRescue : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var specification = new RescuePipeSpecification <T, TRescue>(rescuePipe, rescueContextFactory);

            configure?.Invoke(specification);

            configurator.AddPipeSpecification(specification);
        }
        public static void AddPipeSpecification <TActivity, TLog>(this IPipeConfigurator <CompensateActivityContext <TActivity, TLog> > configurator,
                                                                  IPipeSpecification <CompensateActivityContext <TLog> > specification)
            where TActivity : class, ICompensateActivity <TLog>
            where TLog : class
        {
            if (specification == null)
            {
                throw new ArgumentNullException(nameof(specification));
            }

            IPipeSpecification <CompensateActivityContext <TActivity, TLog> > filterSpecification =
                new SplitFilterPipeSpecification <CompensateActivityContext <TActivity, TLog>, CompensateActivityContext <TLog> >(specification,
                                                                                                                                  (input, context) => input, context => context);

            configurator.AddPipeSpecification(filterSpecification);
        }
示例#25
0
        public static void UseConsoleLog <T>(this IPipeConfigurator <T> configurator, LogFormatter <T> formatter)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (formatter == null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            var pipeBuilderConfigurator = new LogPipeSpecification <T>(Console.Out, formatter);

            configurator.AddPipeSpecification(pipeBuilderConfigurator);
        }
示例#26
0
        static void AddFilters <TActivity, TArguments>(ExecuteActivityPipeBuilder <TActivity, TArguments> builders,
                                                       IPipeConfigurator <RequestContext <ExecuteActivityContext <TActivity, TArguments> > > h)
            where TActivity : class, ExecuteActivity <TArguments>
            where TArguments : class
        {
            foreach (IFilter <ExecuteActivityContext <TActivity, TArguments> > filter in builders.Filters)
            {
                var filterSpecification = new FilterPipeSpecification <ExecuteActivityContext <TActivity, TArguments> >(filter);

                var pipeSpecification = new SplitFilterPipeSpecification
                                        <RequestContext <ExecuteActivityContext <TActivity, TArguments> >, ExecuteActivityContext <TActivity, TArguments> >(
                    filterSpecification, (input, context) => input, context => context.Request);

                h.AddPipeSpecification(pipeSpecification);
            }
        }
        /// <summary>
        /// Use the message scheduler to schedule redelivery of messages based on the retry policy.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="retryPolicy"></param>
        public static void UseDelayedRedelivery <T>(this IPipeConfigurator <ConsumeContext <T> > configurator, IRetryPolicy retryPolicy)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            var redeliverySpecification = new DelayedExchangeRedeliveryPipeSpecification <T>();

            configurator.AddPipeSpecification(redeliverySpecification);

            var retrySpecification = new RedeliveryRetryPipeSpecification <T>(retryPolicy);

            configurator.AddPipeSpecification(retrySpecification);
        }
        public static void UseProfile <T>(this IPipeConfigurator <T> configurator, long trivialThreshold, ReportProfileData <T> reportProfileData)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (reportProfileData == null)
            {
                throw new ArgumentNullException(nameof(reportProfileData));
            }

            var specification = new ProfilePipeSpecification <T>(reportProfileData, trivialThreshold);

            configurator.AddPipeSpecification(specification);
        }
示例#29
0
        static void AddFilters <TActivity, TLog>(CompensateActivityPipeBuilder <TActivity, TLog> builders,
                                                 IPipeConfigurator <RequestContext <CompensateActivityContext <TActivity, TLog> > > h)
            where TActivity : class, CompensateActivity <TLog>
            where TLog : class
        {
            foreach (IFilter <CompensateActivityContext <TActivity, TLog> > filter in builders.Filters)
            {
                var filterSpecification = new FilterPipeSpecification <CompensateActivityContext <TActivity, TLog> >(filter);

                var pipeSpecification = new SplitFilterPipeSpecification
                                        <RequestContext <CompensateActivityContext <TActivity, TLog> >, CompensateActivityContext <TActivity, TLog> >(
                    filterSpecification, (input, context) => input, context => context.Request);

                h.AddPipeSpecification(pipeSpecification);
            }
        }
示例#30
0
        /// <summary>
        /// Adds a content filter that uses a delegate to filter the message content and only accept messages
        /// which pass the filter specification.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="contentFilter">A filter method that returns true to accept the message, or false to discard it</param>
        public static void UseContentFilter <T>(this IPipeConfigurator <ConsumeContext <T> > configurator, Func <ConsumeContext <T>, Task <bool> > contentFilter)
            where T : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (contentFilter == null)
            {
                throw new ArgumentNullException(nameof(contentFilter));
            }

            var specification = new ContentFilterPipeSpecification <T>(contentFilter);

            configurator.AddPipeSpecification(specification);
        }