Microsoft.Azure.ServiceBus-SubscriptionClient忽略RetryPolicy(RetryExponencial)

时间:2019-05-28 16:34:13

标签: c# servicebus retrypolicy

我正在尝试实施重试策略,但是它一直被忽略。 SubscriptionClient中是否有属性可以覆盖我创建客户端时提供的属性?

这是我尝试的代码:

_retryPolicy = new Microsoft.Azure.ServiceBus.RetryExponential(
                       TimeSpan.FromMinutes(2), // MinBackOff
                       TimeSpan.FromMinutes(5), // MaxBackOff
                       3); // Max Retries

_subscriptionClient = new SubscriptionClient(
               serviceBusPersisterConnection.ServiceBusConnectionStringBuilder,
               subscriptionClientName, retryPolicy: _retryPolicy);

因此,这应使其仅以最小2分钟间隔重试3次。 LOG的结果:

28 May 2019 16:34:49.928 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:49.285 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:48.718 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:48.075 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:47.499 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:46.965 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:46.511 MessageId: 1d327c9033de4fc69892766084264
28 May 2019 16:34:45.957 MessageId: 1d327c9033de4fc69892766084264

如您所见,它重试了8次而不是3次,两次重试之间的时间(这是我的主要问题),间隔为半秒。

为确保不是我的重试策略,我改用了此方法:

_subscriptionClient = new SubscriptionClient(
              serviceBusPersisterConnection.ServiceBusConnectionStringBuilder,
              subscriptionClientName, retryPolicy: RetryPolicy.NoRetry);

结果是完全一样的,所以我确定它会被忽略。 任何帮助将不胜感激。

继续努力。

1 个答案:

答案 0 :(得分:0)

RetryExponential适用于服务总线客户端,当存在暂时性错误并没有立即浮现到您的代码中时。即客户端内置的内部重试机制,可在引发异常之前代表您执行重试。如果没有例外,并且您的回调显式放弃了该消息,则此处甚至不会使用重试策略,并且该消息仅经过正常传递,直到MaxDeliveryCount次(在您的方案中为50次),然后进行DQed。

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

您可以了解有关here的更多信息。

希望有帮助。