/// <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); }
/// <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); }
/// <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); }
/// <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); }
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); }
/// <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); }
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); }
/// <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); }
/// <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); }
/// <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); }
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); }
/// <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> /// 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); }
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); }
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); }
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); } }
/// <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); }