private bool ValidateCurrentMessage()
        {
            if (!string.IsNullOrWhiteSpace(CurrentMessage.RoutingKey))
            {
                return(true);
            }
            else
            {
                CurrentLog.Error(CurrentMessage, $"Message without routing key has been received. Skipping it. Processor #{_id}.");

                CurrentMessage.Ack();

                return(false);
            }
        }
        private async Task ProcessMessageAsync(
            IMessageSubscription subscription,
            EnvelopedMessage envelopedMessage,
            object payload,
            MessageHeaders headers)
        {
            var publisher = _repliesPublisher?.Invoke(headers.CorrelationId)
                            ?? ProhibitedRepliesMessagePublisher.Instance;

            var handlingContext = new MessageHandlingContext
                                  (
                envelopedMessage.Exchange,
                envelopedMessage.RetryCount,
                envelopedMessage.RoutingKey
                                  );
            var result = await subscription.InvokeHandlerAsync(_serviceProvider, payload, headers, handlingContext, publisher);

            if (result == null)
            {
                throw new InvalidOperationException("Result should be not null");
            }

            switch (result)
            {
            case MessageHandlingResult.SuccessResult _:
            case MessageHandlingResult.NonTransientFailureResult _:
                CurrentMessage.Ack();
                break;

            case MessageHandlingResult.TransientFailureResult tfr:
                _retryManager.ScheduleRetry(CurrentMessage, tfr.RetryAfter ?? _defaultRetryTimeout);
                break;

            default:
                throw new NotSupportedException($"Unexpected message handling result [{result.GetType().Name}].");
            }
        }