async Task IFilter <ConnectionContext> .Send(ConnectionContext context, IPipe <ConnectionContext> next)
        {
            var receiveSettings = context.GetPayload <ReceiveSettings>();

            string queuePath = context.GetQueuePath(receiveSettings.QueueDescription);

            Uri inputAddress = context.GetQueueAddress(receiveSettings.QueueDescription);

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Creating message receiver for {0}", inputAddress);
            }

            MessagingFactory messagingFactory = await context.MessagingFactory.ConfigureAwait(false);

            MessageReceiver messageReceiver = await messagingFactory.CreateMessageReceiverAsync(queuePath, ReceiveMode.PeekLock)
                                              .ConfigureAwait(false);

            try
            {
                messageReceiver.PrefetchCount = receiveSettings.PrefetchCount;
                messageReceiver.RetryPolicy   = RetryPolicy.Default;

                using (var receiver = new Receiver(messageReceiver, inputAddress, _receivePipe, receiveSettings, _receiveObserver, context.CancellationToken))
                {
                    await _endpointObserver.Ready(new Ready(inputAddress))
                    .ConfigureAwait(false);

                    ReceiverMetrics metrics = await receiver.CompleteTask.ConfigureAwait(false);

                    await _endpointObserver.Completed(new Completed(inputAddress, metrics)).ConfigureAwait(false);

                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("Consumer {0}: {1} received, {2} concurrent", queuePath,
                                         metrics.DeliveryCount,
                                         metrics.ConcurrentDeliveryCount);
                    }
                }
            }
            catch
            {
                if (!messageReceiver.IsClosed)
                {
                    await messageReceiver.CloseAsync().ConfigureAwait(false);
                }

                throw;
            }

            if (!messageReceiver.IsClosed)
            {
                await messageReceiver.CloseAsync().ConfigureAwait(false);
            }

            await next.Send(context).ConfigureAwait(false);
        }
        async Task IFilter <ConnectionContext> .Send(ConnectionContext context, IPipe <ConnectionContext> next)
        {
            var receiveSettings = context.GetPayload <ReceiveSettings>();

            var queuePath = context.GetQueuePath(receiveSettings.QueueDescription);

            var inputAddress = context.GetQueueAddress(receiveSettings.QueueDescription);

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Creating message receiver for {0}", inputAddress);
            }

            MessageReceiver messageReceiver = null;

            try
            {
                var messagingFactory = await context.MessagingFactory.ConfigureAwait(false);

                messageReceiver = await messagingFactory.CreateMessageReceiverAsync(queuePath, ReceiveMode.PeekLock).ConfigureAwait(false);

                messageReceiver.PrefetchCount = receiveSettings.PrefetchCount;

                using (var scope = _supervisor.CreateScope())
                {
                    var receiver = new Receiver(messageReceiver, inputAddress, _receivePipe, receiveSettings, _receiveObserver, scope);

                    await scope.Ready.ConfigureAwait(false);

                    await _endpointObserver.Ready(new Ready(inputAddress)).ConfigureAwait(false);

                    scope.SetReady();

                    try
                    {
                        await scope.Completed.ConfigureAwait(false);
                    }
                    finally
                    {
                        ReceiverMetrics metrics = receiver;

                        await _endpointObserver.Completed(new Completed(inputAddress, metrics)).ConfigureAwait(false);

                        if (_log.IsDebugEnabled)
                        {
                            _log.DebugFormat("Consumer {0}: {1} received, {2} concurrent", queuePath,
                                             metrics.DeliveryCount,
                                             metrics.ConcurrentDeliveryCount);
                        }
                    }
                }
            }
            finally
            {
                if (messageReceiver != null && !messageReceiver.IsClosed)
                {
                    await messageReceiver.CloseAsync().ConfigureAwait(false);
                }
            }

            await next.Send(context).ConfigureAwait(false);
        }
 public Completed(Uri inputAddress, ReceiverMetrics metrics)
 {
     InputAddress            = inputAddress;
     DeliveryCount           = metrics.DeliveryCount;
     ConcurrentDeliveryCount = metrics.ConcurrentDeliveryCount;
 }
        async Task IFilter <ConnectionContext> .Send(ConnectionContext context, IPipe <ConnectionContext> next)
        {
            var receiveSettings = context.GetPayload <ReceiveSettings>();

            var queuePath = context.GetQueuePath(receiveSettings.QueueDescription);

            var inputAddress = context.GetQueueAddress(receiveSettings.QueueDescription);

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Creating message receiver for {0}", inputAddress);
            }


            QueueClient queueClient = null;

            try
            {
                var messagingFactory = await context.SessionMessagingFactory.ConfigureAwait(false);

                queueClient = messagingFactory.CreateQueueClient(queuePath);

                queueClient.PrefetchCount = receiveSettings.PrefetchCount;

                using (var scope = _supervisor.CreateScope($"{TypeMetadataCache<MessageReceiverFilter>.ShortName} - {inputAddress}"))
                {
                    var receiver = new SessionReceiver(context, queueClient, inputAddress, _receivePipe, receiveSettings, _receiveObserver, scope);

                    await scope.Ready.ConfigureAwait(false);

                    await _endpointObserver.Ready(new Ready(inputAddress)).ConfigureAwait(false);

                    scope.SetReady();

                    try
                    {
                        await scope.Completed.ConfigureAwait(false);
                    }
                    finally
                    {
                        ReceiverMetrics metrics = receiver;

                        await _endpointObserver.Completed(new Completed(inputAddress, metrics)).ConfigureAwait(false);

                        if (_log.IsDebugEnabled)
                        {
                            _log.DebugFormat("Consumer {0}: {1} received, {2} concurrent", queuePath,
                                             metrics.DeliveryCount,
                                             metrics.ConcurrentDeliveryCount);
                        }
                    }
                }
            }
            finally
            {
                if (queueClient != null && !queueClient.IsClosed)
                {
                    await queueClient.CloseAsync().ConfigureAwait(false);
                }
            }

            await next.Send(context).ConfigureAwait(false);
        }