c# - Azure 服务总线重试策略不会改变行为

标签 c# azure azureservicebus azure-servicebus-queues

我试图了解 Azure 服务总线上的重试策略,但它没有按我预期的方式工作。我有以下代码,它既监听消息并将消息发送到特定的 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

我还验证了队列上的最大交付计数已设置为任意大的数字,但这并没有改变任何内容:

enter image description here

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

最佳答案

RetryExponential旨在当存在未立即冒泡到您的代码的暂时性错误时由 ASB 客户端使用。 IE。客户端内置的内部重试机制,可在引发异常之前代表您执行重试。如果没有异常并且您的回调显式放弃消息,则此处甚至不会使用重试策略,并且消息只会经过正常传送最多 MaxDeliveryCount 次(50 次)您的场景),然后进行 DLQed。

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

关于c# - Azure 服务总线重试策略不会改变行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41290387/

相关文章:

.net-core - Microsoft Orleans 中的 ServiceBus,OrleansPrepareFailedException 异常

azure - 如何根据解决方案配置更改azure函数local.settings.json?

c# - 让 WebAPI Controller 向同一服务中的另一个 Controller 发送 http 请求

.net - Azure:用户登录失败

c# - 如果数字为零,则显示自定义字符的格式函数

azure - 如何在terraform中的for_each中编写条件

asp.net - Azure Web 应用程序中的 Microsoft 媒体基础

wcf - Azure 服务总线中继响应缓慢

c# - 如何检查通用列表中的空项目

c# - 在 LinqToSql 中切换数据库