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

时间:2016-12-22 19:28:14

标签: c# azure azureservicebus azure-servicebus-queues

我试图理解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次。

Console output

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

enter image description here

我确定我已经过多地将重试政策分配给众多不同的客户/工厂,但我不确定这里有什么问题。

1 个答案:

答案 0 :(得分:4)

RetryExponential旨在供ASB客户端使用时,如果发生的瞬态错误未立即冒充到您的代码中。即内部重试机制内置于客户端,以便在引发异常之前代表您执行重试。如果没有例外您的回调明确放弃了该消息,则此处甚至不会使用重试策略,并且该消息只会通过正常传递达MaxDeliveryCount次(在您的方案中为50)之后是DLQed。

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