Beispiel #1
0
 /// <summary>
 ///     ctor
 /// </summary>
 public ConsumerPump(ChannelReader <Message <T> > channelReader, IPipelineBuilder <T> pipelineBuilder, IServiceProvider serviceProvider, ILogger <ConsumerPump <T> > logger, IOptionsMonitor <PipelineOptions <T> > options)
 {
     _channelReader   = channelReader ?? throw new ArgumentNullException(nameof(channelReader));
     _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
     _logger          = logger ?? throw new ArgumentNullException(nameof(logger));
     _options         = options ?? throw new ArgumentNullException(nameof(options));
     _pipeline        = (pipelineBuilder ?? throw new ArgumentNullException(nameof(pipelineBuilder))).Build();
 }
Beispiel #2
0
        public PipelineDelegate.SingleMiddleware <T> Build()
        {
            Run <HandlerPipelineEndpoint <T> >();

            PipelineDelegate.SingleMiddleware <T> app = (message, cancellationToken, context) => Task.CompletedTask;

            foreach (var middleware in _middleware.Reverse())
            {
                app = middleware(app);
            }

            return(app);
        }
Beispiel #3
0
 /// <inheritDoc />
 protected override async Task OnInvoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next)
 {
     using var scope = messageContext.ServiceProvider.CreateScope();
     await next(message, cancellationToken, new MessageContext(scope.ServiceProvider));
 }
Beispiel #4
0
 /// <inheritDoc />
 protected override async Task OnInvoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next)
 {
     if (TryGetActivityId(message, out var activityId))
     {
         using (Trace.WithActivity(ConsumeActivityName, activityId))
             await next(message, cancellationToken, messageContext);
     }
     else
     {
         await next(message, cancellationToken, messageContext);
     }
 }
Beispiel #5
0
        /// <inheritdoc />
        protected override async Task OnInvoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next)
        {
            if (!string.IsNullOrWhiteSpace(_optionsMonitor.CurrentValue.PolicyName) && _policyRegistry.TryGet <IAsyncPolicy>(_optionsMonitor.CurrentValue.PolicyName, out var policy))
            {
                await policy.ExecuteAsync(async ct => await next(message, ct, messageContext), cancellationToken);

                return;
            }

            await next(message, cancellationToken, messageContext);
        }
Beispiel #6
0
 /// <summary>
 ///     Invokes the middleware
 /// </summary>
 /// <param name="message">The message to handle</param>
 /// <param name="cancellationToken">The current cancellation token</param>
 /// <param name="messageContext">The context of the message</param>
 /// <param name="next">The next middleware to run</param>
 protected abstract Task OnInvoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next);
Beispiel #7
0
        /// <inheritdoc />
        public Task Invoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next)
        {
            if (message is null)
            {
                Throw.ArgumentNullException(nameof(message));
            }

            if (messageContext is null)
            {
                Throw.ArgumentNullException(nameof(messageContext));
            }

            cancellationToken.ThrowIfCancellationRequested();

            return(OnInvoke(message, cancellationToken, messageContext, next));
        }
Beispiel #8
0
        /// <inheritDoc />
        protected override async Task OnInvoke(Message <T> message, CancellationToken cancellationToken, MessageContext messageContext, PipelineDelegate.SingleMiddleware <T> next)
        {
            try
            {
                await next(message, cancellationToken, messageContext);

                if (message is ISupportAcknowledgement acknowledgement)
                {
                    await acknowledgement.AcknowledgeAsync();
                }
            }
            catch (Exception e)
            {
                if (message is ISupportAcknowledgement acknowledgement)
                {
                    await acknowledgement.AcknowledgeAsync(false, e);
                }

                throw;
            }
        }