Azure Service Bus重试策略不会更改行为

Mat*_*uwe 1 c# azure azureservicebus azure-servicebus-queues

我正在尝试了解Azure Service Bus上的重试策略,但是它没有按我期望的方式工作。我有以下代码,它们既侦听消息,又将消息发送到特定的天蓝色队列。

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使我指定重试策略应重试15次,但我仍然看到它仅重试默认值10次。我什至尝试使用NoRetry策略,但是它仍然重试10次。

控制台输出

我还验证Maximum Delivery Count了队列中的设置为任意大的数字,但这没有任何改变:

在此处输入图片说明

我确定我将重试策略分配给众多不同的客户/工厂的做法太过分了,但是我不确定这里出了什么问题。

Sea*_*man 5

RetryExponential当瞬时错误没有立即浮现到您的代码中时,ASB客户端将使用该代码。即客户端内置的内部重试机制,可以在引发异常之前代表您执行重试。如果没有异常,并且您的回调显式放弃了该消息,则此处甚至不使用重试策略,并且该消息只是经过正常的传递直到MaxDeliveryCount时间(在您的方案中为50),之后才是DLQed。

使用重试策略向ASB客户端指定在放弃之前如何处理瞬态错误,而不是消息可以出队多少次。

  • 那么,有什么方法可以让侦听器的消息处理程序发生暂时性错误时发生这种重试行为?如果我遇到暂时性错误(数据库重新启动、网络打嗝),我想在 1 秒、3 秒等后重试 - 而不是立即重试,这就是我放弃消息时会发生的情况。我正在使用主题订阅,因此我不能只是将副本扔回主题(会导致其他订阅中的重复)。有任何想法吗? (2认同)