Политика повторных попыток Azure Service Bus не меняет поведение

Я пытаюсь понять политику повторных попыток в служебной шине Azure, но она работает не так, как я ожидал. У меня есть следующий код, который слушает сообщения и отправляет сообщение в определенную лазурную очередь.

using System;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;

namespace ServiceBusTester
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "Endpoint=sb://<NamespaceName>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SharedAccessKey>";
            var queueName = "MyTestQueue";

            var retryPolicy = new RetryExponential(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(30), 15);

            var ns = NamespaceManager.CreateFromConnectionString(connectionString);
            ns.Settings.RetryPolicy = retryPolicy;

            if (!ns.QueueExists(queueName))
                ns.CreateQueue(queueName);

            var mf = MessagingFactory.CreateFromConnectionString(connectionString);
            mf.RetryPolicy = retryPolicy;

            var mr = mf.CreateMessageReceiver(queueName);
            mr.RetryPolicy = retryPolicy;

            var retryCount = 0;

            mr.OnMessage(_ =>
            {
                retryCount++;
                Console.WriteLine($"{retryCount.ToString().PadLeft(4, ' ')} - Message Received: {_.GetBody<string>()}");
                _.Abandon();
            }, new OnMessageOptions() { AutoComplete = true });


            var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
            client.RetryPolicy = retryPolicy;

            var message = new BrokeredMessage("This is a test message!");

            client.Send(message);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Несмотря на то, что я указываю, что политика повторных попыток должна повторяться 15 раз, я все еще вижу, что она повторяет попытку по умолчанию только 10 раз. Я даже пытался использовать политику NoRetry, но она все еще повторяется 10 раз.

Консольный вывод

Я также подтвердил, что Maximum Delivery Count в очереди было установлено произвольно большое число, но это ничего не изменило:

введите описание изображения здесь

Я уверен, что перешел слишком много времени с назначением политики повторных попыток многочисленным клиентам / фабрикам, но я не уверен, что здесь не так.

1 ответ

Решение

RetryExponential предназначен для использования клиентом ASB, когда есть временные ошибки, которые не сразу попадают в ваш код. Т.е. встроенный в клиент механизм повторных попыток для выполнения повторных попыток от вашего имени до возникновения исключения. Если исключений нет и ваш обратный вызов явно отменяет сообщение, политика повторных попыток здесь даже не используется, и сообщение просто проходит обычную доставку до MaxDeliveryCount раз (50 в вашем сценарии), после чего DLQed.

Используйте политику повтора, чтобы указать клиенту ASB, как обрабатывать временные ошибки до отказа, а не сколько раз сообщение может быть удалено.

Другие вопросы по тегам