public async Task <NimbusMessage> Peek()
        {
            var messageReceiver = await _queueManager.CreateDeadQueueMessageReceiver();

            var Message = await messageReceiver.PeekAsync();

            if (Message == null)
            {
                return(null);
            }

            var nimbusMessage = await _brokeredMessageFactory.BuildNimbusMessage(Message);

            return(nimbusMessage);
        }
Ejemplo n.º 2
0
        protected override Task <NimbusMessage> Fetch(CancellationToken cancellationToken)
        {
            return(Task.Run(async() =>
            {
                await _receiveSemaphore.WaitAsync(_pollInterval, cancellationToken);

                if (cancellationToken.IsCancellationRequested)
                {
                    await _subscriptionClient.CloseAsync();
                    return null;
                }

                if (_messages.Count == 0)
                {
                    return null;
                }

                var message = _messages.Take();

                var nimbusMessage = await _brokeredMessageFactory.BuildNimbusMessage(message);
                nimbusMessage.Properties[MessagePropertyKeys.RedeliveryToSubscriptionName] = _subscriptionName;

                return nimbusMessage;
            },
                            cancellationToken).ConfigureAwaitFalse());
        }
        protected override async Task <NimbusMessage> Fetch(CancellationToken cancellationToken)
        {
            try
            {
                using (var cancellationSemaphore = new SemaphoreSlim(0, int.MaxValue))
                {
                    var subscriptionClient = await GetSubscriptionClient();

                    var receiveTask      = subscriptionClient.ReceiveAsync(TimeSpan.FromSeconds(300)).ConfigureAwaitFalse();
                    var cancellationTask = Task.Run(async() => await CancellationTask(cancellationSemaphore, cancellationToken), cancellationToken).ConfigureAwaitFalse();
                    await Task.WhenAny(receiveTask, cancellationTask);

                    if (!receiveTask.IsCompleted)
                    {
                        return(null);
                    }

                    cancellationSemaphore.Release();

                    var brokeredMessage = await receiveTask;
                    if (brokeredMessage == null)
                    {
                        return(null);
                    }

                    var nimbusMessage = await _brokeredMessageFactory.BuildNimbusMessage(brokeredMessage);

                    nimbusMessage.Properties[MessagePropertyKeys.RedeliveryToSubscriptionName] = _subscriptionName;

                    return(nimbusMessage);
                }
            }
            catch (MessagingEntityNotFoundException exc)
            {
                _logger.Error(exc, "The referenced topic subscription {TopicPath}/{SubscriptionName} no longer exists", _topicPath, _subscriptionName);
                await _queueManager.MarkSubscriptionAsNonExistent(_topicPath, _subscriptionName);

                DiscardSubscriptionClient();
                throw;
            }
            catch (Exception exc)
            {
                _logger.Error(exc, "Messaging operation failed. Discarding message receiver.");
                DiscardSubscriptionClient();
                throw;
            }
        }
        protected override async Task <NimbusMessage> Fetch(CancellationToken cancellationToken)
        {
            try
            {
                using (var cancellationSemaphore = new SemaphoreSlim(0, int.MaxValue))
                {
                    var messageReceiver = await GetMessageReceiver();

                    var receiveTask      = messageReceiver.ReceiveAsync(TimeSpan.FromSeconds(300)).ConfigureAwaitFalse();
                    var cancellationTask = Task.Run(async() => await CancellationTask(cancellationSemaphore, cancellationToken), cancellationToken).ConfigureAwaitFalse();

                    await Task.WhenAny(receiveTask, cancellationTask);

                    if (!receiveTask.IsCompleted)
                    {
                        return(null);
                    }

                    cancellationSemaphore.Release();

                    var brokeredMessage = await receiveTask;
                    if (brokeredMessage == null)
                    {
                        return(null);
                    }

                    var nimbusMessage = await _brokeredMessageFactory.BuildNimbusMessage(brokeredMessage);

                    return(nimbusMessage);
                }
            }
            catch (MessagingEntityNotFoundException exc)
            {
                _logger.Error(exc, "The referenced queue {QueuePath} no longer exists", _queuePath);
                await _queueManager.MarkQueueAsNonExistent(_queuePath);

                DiscardMessageReceiver();
                throw;
            }
            catch (Exception exc)
            {
                _logger.Error(exc, "Messaging operation failed. Discarding message receiver.");
                DiscardMessageReceiver();
                throw;
            }
        }