我正在努力确保ServiceBusSender.SendMessageAsync()的重试功能正常工作。经过多次重试,我需要做点别的事。
目前,我正在执行以下操作,以同时模拟ServiceBusClient和ServiceBusSender,但是当我遍历代码时,我无法看到SendMessageAsync()被调用了我期望的重试次数。
var serviceBusClientMock = new Mock<ServiceBusClient>(
It.IsAny<string>(), new ServiceBusClientOptions()
{
RetryOptions = new ServiceBusRetryOptions()
{
Mode = ServiceBusRetryMode.Fixed,
Delay = TimeSpan.FromSeconds(3),
MaxDelay = TimeSpan.FromSeconds(10),
MaxRetries = 3
}
});
var serviceBusSenderMock = new Mock<ServiceBusSender>();
serviceBusSenderMock.Setup(x => x.SendMessageAsync(It.IsAny<ServiceBusMessage>(), It.IsAny<CancellationToken>()))
.Throws(new ServiceBusException("Region Down", ServiceBusFailureReason.ServiceTimeout));
serviceBusClientMock.Setup(x => x.CreateSender(It.IsAny<string>()))
.Returns(serviceBusSenderMock.Object);
发布于 2022-08-04 14:01:20
其中大部分都是通过评论来取笑的,但为了提供证实:
这听起来好像已经在SendMessageAsync()方法中发生了,所以我无法在我的代码中看到它们。
这是正确的。
客户端重试是隐式的;您的应用程序不知道它们正在发生,只是操作需要更长时间才能完成。在这种情况下,当控件在"SendMessageAsync“调用后返回到应用程序时,已经应用了所有重试。如果应用程序看到异常,则该异常要么是终端(而不是重新尝试),要么是在操作成功之前所有重试尝试都已用尽。
对于您的应用程序来说,观察没有出现的异常的最简单方法是通过SDK日志。可以在这个样本中找到启用它们的上下文。
您还可以创建自定义重试策略,通过用于创建客户端的ServiceBusClientOptions传递该策略。那里的RetryOptions
成员有一个CustomRetryPolicy属性,允许您指定抽象ServiceBusRetryPolicy类的自己的实现。这将允许您的应用程序观察所有异常,并拥有是否重试的决定。也就是说,除非您从我们内置的BasicRetryPolicy中复制逻辑,否则您可能正在改变标准行为。
不确定如果提供错误的命名空间会发生什么
正如注释中提到的,了解错误场景的最佳地方是查看概述文档的异常处理部分。
如果配置了错误的命名空间,或者客户端无法到达名称空间,您将看到来自.NET网络堆栈的异常、TimeoutException
或OperationCanceledException
,这取决于异常来自网络/传输堆栈的位置。
如果主题不正确,您将看到一个ServiceBusException
,其Reason
属性设置为ServiceBusFailureReason.MessagingEntityNotFound
。这是不可寻回的。
模拟主题不可用
这不是服务记录的场景,因为主题之类的实体会被监视,并会自动恢复。如果一个主题在超过几秒钟内不可用,很可能会出现一些非常错误的问题,并影响到多个数据中心。
在主题节点的任何迁移或恢复过程中,服务调用将经历短暂故障(超时、服务繁忙或一般通信失败)--这将由客户端重试策略处理。
这里要提到的一个警告是,可以通过Azure Portal手动禁用一个主题。在这种情况下,ServiceBusException
的失败原因被设置为MessagingEntityDisabled
。这是不重试的,它需要手动操作才能解决。
https://stackoverflow.com/questions/73230967
复制相似问题