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