为什么我的事件中心指数重试策略不会永远持续下去?

Why does my Event Hub exponential retry policy not continue forever?

我希望以下代码 永远 重试,但它在与网络断开连接约 40 秒后始​​终抛出异常 - 这是我能做的最好的模拟短暂的 Internet 连接或事件中心中断。

var eventHubClient = EventHubClient.CreateFromConnectionString(…);
eventHubClient.RetryPolicy = new RetryExponential(
    TimeSpan.FromSeconds(5), // minBackoff
    TimeSpan.FromMinutes(2), // maxBackoff
    Int32.MaxValue); // maxRetryCount
…
eventHubClient.SendAsync(…).Wait();

这是怎么回事?

我在 .NET Framework 4.6 上使用 WindowsAzure.ServiceBus NuGet 包,版本 4.1.10。如果需要,我愿意更改包或框架。

This answer to a related question 让我走上正轨。事实证明,在 EventHubClient 的 class 层次结构中,有一个对服务总线包的 MessagingFactory 的引用——它有自己的 每个操作超时未通过 EventHubClient 类型 .

公开

所以设置超时时间很长的客户端的方法是这样的:

var builder = new ServiceBusConnectionStringBuilder(connectionString)
{
    OperationTimeout = TimeSpan.FromDays(30), // TimeSpan.MaxValue is not allowed
    TransportType = TransportType.Amqp // This needs to be set; default is NetMessaging
};
var messagingFactory = MessagingFactory.CreateFromConnectionString(builder.ToString());
var eventHubClient = messagingFactory.CreateEventHubClient(entityPath);
eventHubClient.RetryPolicy = new RetryExponential(
    TimeSpan.FromSeconds(5),
    TimeSpan.FromMinutes(2),
    Int32.MaxValue);

话虽这么说, 在验证此方法有效后,我意识到在我的场景中,在重试期间发送遥测数据实际上很重要,所以我实际上回到了默认重试策略在 EventHubClient 上,并使用 the Polly librarySendAsync(…) 调用与单独的重试策略包装在一起,允许我在每次重试之前发送遥测数据。