private async Task ProcessMessage(QueuedMessage message, IOutboundQueueConsumer queue)
        {
            try
            {
                await ProduceMessage(message.Message);

                await queue.Acknowledge(message);
            }
            catch (Exception ex)
            {
                _messageLogger.LogError(_logger, ex, "Failed to publish queued message.", message?.Message.Message, message?.Message.Endpoint);

                await queue.Retry(message);

                // Rethrow if message order has to be preserved, otherwise go ahead with next message in the queue
                if (_enforceMessageOrder)
                {
                    throw;
                }
            }
        }
        private async Task ProcessQueue(IOutboundQueueConsumer queue, CancellationToken stoppingToken)
        {
            _logger.LogTrace($"Reading outbound messages from queue (limit: {_readPackageSize}).");

            var messages = (await queue.Dequeue(_readPackageSize)).ToList();

            if (!messages.Any())
            {
                _logger.LogTrace("The outbound queue is empty.");
            }

            for (var i = 0; i < messages.Count; i++)
            {
                _logger.LogTrace($"Processing message {i + 1} of {messages.Count}.");
                await ProcessMessage(messages[i], queue);

                if (stoppingToken.IsCancellationRequested)
                {
                    break;
                }
            }
        }
 public OutboundQueueHealthCheckService(IOutboundQueueConsumer queue)
 {
     _queue = queue;
 }