首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用重试选项模拟ServiceBusClient

如何使用重试选项模拟ServiceBusClient
EN

Stack Overflow用户
提问于 2022-08-04 06:01:10
回答 1查看 208关注 0票数 0

我正在努力确保ServiceBusSender.SendMessageAsync()的重试功能正常工作。经过多次重试,我需要做点别的事。

目前,我正在执行以下操作,以同时模拟ServiceBusClient和ServiceBusSender,但是当我遍历代码时,我无法看到SendMessageAsync()被调用了我期望的重试次数。

代码语言:javascript
代码运行次数:0
运行
复制
             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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 14:01:20

其中大部分都是通过评论来取笑的,但为了提供证实:

这听起来好像已经在SendMessageAsync()方法中发生了,所以我无法在我的代码中看到它们。

这是正确的。

客户端重试是隐式的;您的应用程序不知道它们正在发生,只是操作需要更长时间才能完成。在这种情况下,当控件在"SendMessageAsync“调用后返回到应用程序时,已经应用了所有重试。如果应用程序看到异常,则该异常要么是终端(而不是重新尝试),要么是在操作成功之前所有重试尝试都已用尽。

对于您的应用程序来说,观察没有出现的异常的最简单方法是通过SDK日志。可以在这个样本中找到启用它们的上下文。

您还可以创建自定义重试策略,通过用于创建客户端的ServiceBusClientOptions传递该策略。那里的RetryOptions成员有一个CustomRetryPolicy属性,允许您指定抽象ServiceBusRetryPolicy类的自己的实现。这将允许您的应用程序观察所有异常,并拥有是否重试的决定。也就是说,除非您从我们内置的BasicRetryPolicy中复制逻辑,否则您可能正在改变标准行为。

不确定如果提供错误的命名空间会发生什么

正如注释中提到的,了解错误场景的最佳地方是查看概述文档的异常处理部分。

如果配置了错误的命名空间,或者客户端无法到达名称空间,您将看到来自.NET网络堆栈的异常、TimeoutExceptionOperationCanceledException,这取决于异常来自网络/传输堆栈的位置。

如果主题不正确,您将看到一个ServiceBusException,其Reason属性设置为ServiceBusFailureReason.MessagingEntityNotFound。这是不可寻回的。

模拟主题不可用

这不是服务记录的场景,因为主题之类的实体会被监视,并会自动恢复。如果一个主题在超过几秒钟内不可用,很可能会出现一些非常错误的问题,并影响到多个数据中心。

在主题节点的任何迁移或恢复过程中,服务调用将经历短暂故障(超时、服务繁忙或一般通信失败)--这将由客户端重试策略处理。

这里要提到的一个警告是,可以通过Azure Portal手动禁用一个主题。在这种情况下,ServiceBusException的失败原因被设置为MessagingEntityDisabled。这是不重试的,它需要手动操作才能解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73230967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档