/// <inheritdoc /> public override async Task HandleFailureAsync(MessageContext context, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var deliveryCount = GetDeliveryCount(context.Message); if (deliveryCount >= MaxDeliveryCount) { await context.MessageReceiver.AbandonAsync(context.Message.SystemProperties.LockToken).ConfigureAwait(false); return; } var messageLocator = context.Message.CreateDeferredMessageLocator(BackOffDelayStrategy.Calculate(deliveryCount)); var sender = context.CreateMessageSender(); try { using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { await sender.SendAsync(messageLocator).ConfigureAwait(false); await context.MessageReceiver.DeferAsync(context.Message.SystemProperties.LockToken) .ConfigureAwait(false); scope.Complete(); } } finally { await sender.CloseAsync(); } }
public override async Task HandleFailureAsync(MessageContext context, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var deliveryCount = GetDeliveryCount(context.Message); if (deliveryCount >= MaxDeliveryCount) { await context.MessageReceiver.DeadLetterAsync( context.Message.SystemProperties.LockToken, $"Max delivery count of {MaxDeliveryCount} has been reached.") .ConfigureAwait(false); return; } var clone = context.Message.Clone(); clone.MessageId = Guid.NewGuid().ToString(); clone.ScheduledEnqueueTimeUtc = DateTime.UtcNow + BackOffDelayStrategy.Calculate(deliveryCount); clone.UserProperties[Constants.RetryCountKey] = deliveryCount; var sender = context.CreateMessageSender(); try { using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { await sender.SendAsync(clone).ConfigureAwait(false); await context.MessageReceiver.CompleteAsync(context.Message.SystemProperties.LockToken) .ConfigureAwait(false); scope.Complete(); } } finally { await sender.CloseAsync(); } }