async Task IFilter <SessionContext> .Send(SessionContext context, IPipe <SessionContext> next) { var receiveSettings = context.GetPayload <ReceiveSettings>(); var inputAddress = receiveSettings.GetInputAddress(context.ConnectionContext.HostSettings.HostAddress); List <Task <ActiveMqBasicConsumer> > consumers = new List <Task <ActiveMqBasicConsumer> >(); consumers.Add(CreateConsumer(context, inputAddress, receiveSettings.EntityName, receiveSettings.Selector)); consumers.AddRange(_context.BrokerTopology.Consumers.Select(x => CreateConsumer(context, inputAddress, x.Destination.EntityName, x.Selector))); var actualConsumers = await Task.WhenAll(consumers).ConfigureAwait(false); await _transportObserver.Ready(new ReceiveTransportReadyEvent(inputAddress)).ConfigureAwait(false); try { await Task.WhenAll(actualConsumers.Select(x => x.Completed)).ConfigureAwait(false); } finally { var consumerMetrics = actualConsumers.Cast <DeliveryMetrics>().ToArray(); DeliveryMetrics metrics = new CombinedDeliveryMetrics(consumerMetrics.Sum(x => x.DeliveryCount), consumerMetrics.Max(x => x.ConcurrentDeliveryCount)); await _transportObserver.Completed(new ReceiveTransportCompletedEvent(inputAddress, metrics)).ConfigureAwait(false); if (_log.IsDebugEnabled) { _log.DebugFormat("Consumer completed: {0} received, {0} concurrent", metrics.DeliveryCount, metrics.ConcurrentDeliveryCount); } } }
async Task IFilter <SessionContext> .Send(SessionContext context, IPipe <SessionContext> next) { var receiveSettings = context.GetPayload <ReceiveSettings>(); var inputAddress = receiveSettings.GetInputAddress(context.ConnectionContext.HostAddress); var executor = new ChannelExecutor(receiveSettings.PrefetchCount, receiveSettings.ConcurrentMessageLimit); var consumers = new List <Task <ActiveMqConsumer> > { CreateConsumer(context, receiveSettings.EntityName, receiveSettings.Selector, receiveSettings.PrefetchCount, executor) }; consumers.AddRange(_context.BrokerTopology.Consumers.Select(x => CreateConsumer(context, x.Destination.EntityName, x.Selector, receiveSettings.PrefetchCount, executor))); ActiveMqConsumer[] actualConsumers = await Task.WhenAll(consumers).ConfigureAwait(false); var supervisor = CreateConsumerSupervisor(context, actualConsumers); LogContext.Debug?.Log("Consumers Ready: {InputAddress}", _context.InputAddress); await _context.TransportObservers.Ready(new ReceiveTransportReadyEvent(inputAddress)).ConfigureAwait(false); try { await supervisor.Completed.ConfigureAwait(false); } finally { DeliveryMetrics[] consumerMetrics = actualConsumers.Cast <DeliveryMetrics>().ToArray(); DeliveryMetrics metrics = new CombinedDeliveryMetrics(consumerMetrics.Sum(x => x.DeliveryCount), consumerMetrics.Max(x => x.ConcurrentDeliveryCount)); await _context.TransportObservers.Completed(new ReceiveTransportCompletedEvent(inputAddress, metrics)).ConfigureAwait(false); LogContext.Debug?.Log("Consumer completed {InputAddress}: {DeliveryCount} received, {ConcurrentDeliveryCount} concurrent", inputAddress, metrics.DeliveryCount, metrics.ConcurrentDeliveryCount); await executor.DisposeAsync().ConfigureAwait(false); } }