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