Azure 服务总线重试策略不会改变行为
Azure Service Bus Retry Policy doesn't change the behavior
我试图了解 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 次。
我还验证了队列中的 Maximum Delivery Count
被设置为任意大的数字,但这并没有改变任何东西:
我确定我已经将重试策略分配给众多不同的客户/工厂,但我不确定这里出了什么问题。
RetryExponential
旨在供 ASB 客户端在存在不会立即冒泡到您的代码的暂时性错误时使用。 IE。客户端内置的内部重试机制,用于在引发异常之前代表您执行重试。如果没有异常 和 你的回调显式地放弃消息,这里甚至不使用重试策略并且消息只是通过正常传递最多 MaxDeliveryCount
次(50 in你的场景),之后是 DLQed。
使用重试策略向 ASB 客户端指定在放弃之前如何处理暂时性错误,而不是消息可以出列多少次。
我试图了解 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 次。
我还验证了队列中的 Maximum Delivery Count
被设置为任意大的数字,但这并没有改变任何东西:
我确定我已经将重试策略分配给众多不同的客户/工厂,但我不确定这里出了什么问题。
RetryExponential
旨在供 ASB 客户端在存在不会立即冒泡到您的代码的暂时性错误时使用。 IE。客户端内置的内部重试机制,用于在引发异常之前代表您执行重试。如果没有异常 和 你的回调显式地放弃消息,这里甚至不使用重试策略并且消息只是通过正常传递最多 MaxDeliveryCount
次(50 in你的场景),之后是 DLQed。
使用重试策略向 ASB 客户端指定在放弃之前如何处理暂时性错误,而不是消息可以出列多少次。