예제 #1
0
        private async Task <(bool Handled, int RedeliveryCount)> HandleRedelivery(MessageProperties properties, MessageReceivedInfo info, Func <IQueue, Task> requeue)
        {
            var redeliveryCount = 0;

            if (properties.Headers.ContainsKey(MessageHeaders.RedeliveryCount) &&
                properties.Headers[MessageHeaders.RedeliveryCount] is int msgRedeliveryCount)
            {
                redeliveryCount = msgRedeliveryCount;
            }

            if (info.Redelivered)
            {
                var redeliveryLimit = _messageBus.Value.RedeliveryLimit;
                if (properties.Headers.ContainsKey(MessageHeaders.RedeliveryLimit) &&
                    properties.Headers[MessageHeaders.RedeliveryLimit] is int msgRedeliveryLimit)
                {
                    redeliveryLimit = msgRedeliveryLimit;
                }

                if (redeliveryLimit.HasValue && redeliveryCount >= redeliveryLimit)
                {
                    throw new RedeliveryLimitException();
                }

                properties.Headers[MessageHeaders.RedeliveryCount] = redeliveryCount + 1;

                var redeliveryDelay = _messageBus.Value.RedeliveryDelay;
                if (properties.Headers.ContainsKey(MessageHeaders.RedeliveryDelay) &&
                    properties.Headers[MessageHeaders.RedeliveryDelay] is int msgRedeliveryDelay)
                {
                    redeliveryDelay = TimeSpan.FromMilliseconds(msgRedeliveryDelay);
                }

                if (redeliveryDelay.HasValue)
                {
                    properties.Expiration = redeliveryDelay.Value.TotalMilliseconds.ToString("F0");

                    await requeue(await _easyNetQBus.GetDelayQueueAsync(_queue.Name));
                }
                else
                {
                    await requeue(_queue);
                }

                return(true, redeliveryCount);
            }

            return(false, redeliveryCount);
        }