Example #1
0
        /// <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();
            }
        }
Example #2
0
        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();
            }
        }