void EnsureClientConfiguredForReceiveEvents(QueueClientContext clientContext)
        {
            if (clientContext.IsConfiguredForReceiveEvents)
            {
                return;
            }

            lock (clientContext.Client)
            {
                if (clientContext.IsConfiguredForReceiveEvents)
                {
                    return;
                }

                clientContext.IsConfiguredForReceiveEvents = true;
            }

            var client    = clientContext.Client;
            var queueName = clientContext.QueueName;

            client.OnMessageAsync(message =>
            {
                Trace.WriteLine(string.Format("Received message: {0}", message.MessageId));

                var context = SetCurrentMessageContext(queueName, message);
                if (context != null)
                {
                    return(context.Handle.Task.ContinueWith(task => Trace.WriteLine(string.Format("Task complete: {0}", context.CorrelationId))));
                }

                message.Abandon();
                var abortTask = new TaskCompletionSource <bool>();
                abortTask.SetCanceled();
                return(abortTask.Task);
            },
                                  new OnMessageOptions {
                AutoComplete = false, MaxConcurrentCalls = 1
            });
        }
        async Task IFilter <NamespaceContext> .Send(NamespaceContext context, IPipe <NamespaceContext> next)
        {
            var queuePath = context.GetQueuePath(_settings.QueueDescription);

            var inputAddress = _settings.GetInputAddress(context.ServiceAddress);

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

            QueueClient queueClient = null;

            try
            {
                var messagingFactory = _settings.RequiresSession
                    ? await context.SessionMessagingFactory.ConfigureAwait(false)
                    : await context.MessagingFactory.ConfigureAwait(false);

                queueClient = messagingFactory.CreateQueueClient(queuePath);

                queueClient.PrefetchCount = _settings.PrefetchCount;

                ClientContext clientContext = new QueueClientContext(queueClient, inputAddress);

                context.GetOrAddPayload(() => clientContext);

                await next.Send(context).ConfigureAwait(false);
            }
            finally
            {
                if (queueClient != null && !queueClient.IsClosed)
                {
                    await queueClient.CloseAsync().ConfigureAwait(false);
                }
            }
        }