Service Bus 1.1(On Prem)消息发件人重试策略不起作用

问题描述:

不确定我的Service Bus 1.1的重试策略逻辑有什么问题。我们无法使用Azure服务总线。我尝试了几种不同的配置,但仍然没有运气让它着火。它只会移动到例外。Service Bus 1.1(On Prem)消息发件人重试策略不起作用

TokenProvider provider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "<key goes here>"); 
var retryPolicy = new RetryExponential(TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(3), 
       TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(5), 1000); 
var _factory = MessagingFactory.Create("<Namespace Address>", provider); 
var _sender = _factory.CreateMessageSender("Analytics"); 
_sender.RetryPolicy = retryPolicy; 
var message = new BrokeredMessage("message"); 
try 
{ 
    _sender.Send(message); 
} 
catch(Exception e) 
{ 
    Console.WriteLine(e); 
} 

为了测试目的,我制定了异常大的重试策略。据我所知,它从不重试信息。我已经测试了各种例外情况,包括那些瞬息万色的情况。

我已经经历了这些帖子和文章已经阅读:

有没有人跑进这之前?我希望我只是想念一些简单的事情。

+0

报告的错误消息是什么? – Raj

+0

重试策略应该尝试在抛出异常之前重新发送消息。这就是我要问的,为什么不这样做?没有错误消息,它只是不重试。我们正在模拟服务总线故障。例外情况按要求工作,重试从未发生。它立即引发异常。 –

+0

@ J-Mac - 请您详细说明您是如何模拟服务总线故障的。我目前面临同样的问题,你已经提到你的问题,我想看看我的重试逻辑是否工作或不... – gkb

重试机制的工作原理是这样

从服务总线返回暴露IsTransient属性,指示如果客户端应该重试运行的异常。内置的RetryExponential策略依赖于MessagingException类中的IsTransient属性,该类是所有Service Bus异常的基类。

检查OperationTimeout

console.WriteLine(_factory.GetSettings().OperationTimeout); 

如果该值小于maxBackoff然后设置OperationTimeout高于maxBackoff

_factory.GetSettings().OperationTimeout = TimeSpan.FromMinutes(6); 

创建的MessageFactory

+0

是的,我已经阅读,并在问题中说明我已经验证IsTransient是真实的。我们正在测试的异常是MessagingExceptions(尽管在代码示例中我使用了一个通用的示例)。 –

+0

maxBackoff大于OperationTimeout(默认为一分钟),在MessagingFactorySettings中设置OperationTimeout大于maxBackoff – Raj

+0

我按照建议对OperationTimeout进行了更新,但行为相同。重试从未发生。 –

之后,我发现这个博客帖子:

右键单击在Solution Explorer中的项目,然后选择管理的NuGet包。在搜索框中键入瞬态故障处理,然后单击搜索。选择Enterprise Library - 瞬态故障处理应用程序块程序包。单击“安装”后,会将一组必要的支持瞬态故障处理应用程序块的程序集和引用添加到项目中。

实现接口后,我能够成功执行重试策略。

我仍然不确定为什么默认的不会工作。