- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Azure 服务总线支持内置重试机制,使废弃的消息立即可见以供另一次读取尝试。我正在尝试使用此机制来处理一些暂时性错误,但该消息在被放弃后立即可用。
我想做的是让消息在被放弃后的一段时间内不可见,最好基于指数递增的策略。
我尝试在放弃消息时设置 ScheduledEnqueueTimeUtc
属性,但似乎没有效果:
var messagingFactory = MessagingFactory.CreateFromConnectionString(...);
var receiver = messagingFactory.CreateMessageReceiver("test-queue");
receiver.OnMessageAsync(async brokeredMessage =>
{
await brokeredMessage.AbandonAsync(
new Dictionary<string, object>
{
{ "ScheduledEnqueueTimeUtc", DateTime.UtcNow.AddSeconds(30) }
});
}
});
我考虑过根本不放弃消息,只是让锁过期,但这需要有某种方法来影响 MessageReceiver
如何指定消息的锁定持续时间,我可以在 API 中找不到任何可以让我更改此值的内容。此外,在需要锁定之前,无法读取消息的传递计数(因此无法决定等待下一次重试的时间)。
消息总线中的重试策略是否会受到某种方式的影响,或者是否可以通过其他方式人为地引入延迟?
最佳答案
这里要小心,因为我认为您将重试功能与用于 OnMessage
事件驱动消息处理的自动 Complete
/Abandon
机制混淆了。当对服务总线的调用失败时,内置的重试机制就会发挥作用。例如,如果您调用将消息设置为完成并且失败,则重试机制将启动。如果您正在处理消息,您自己的代码中会发生异常,该异常不会通过重试功能触发重试。您的问题没有明确说明错误是否来自您的代码或尝试联系服务总线时。
如果您确实修改了尝试与服务总线通信时发生错误时发生的重试策略,则可以修改 MessageReciver
上设置的 RetryPolicy
本身。默认情况下使用一个 RetryExponitial
,以及一个您可以创建自己的抽象 RetryPolicy
。
我认为您想要的是更好地控制当您在处理过程中遇到异常时会发生什么,并且您想推迟处理该消息。有几个选项:
当您创建消息处理程序时,您可以设置 OnMessageOptions 。属性之一是“自动完成”。默认情况下,此设置为 true,这意味着一旦消息处理完成,就会自动调用 Complete
方法。如果发生异常,则会自动调用放弃,这就是您所看到的。通过将 AutoComplete 设置为 false,您需要从消息处理程序中自行调用 Complete。如果不这样做,将导致消息锁最终耗尽,这是您正在寻找的行为之一。
因此,您可以编写处理程序,以便在处理过程中发生异常时,您只需调用 Complete
即可。然后,该消息将保留在队列中,直到锁耗尽,然后再次可用。应用标准的死信机制,在尝试 x 次后,它将自动放入死信队列。
以这种方式处理的一个注意事项是任何类型的异常都将以这种方式处理。您确实需要考虑什么类型的异常正在执行此操作以及您是否确实想推迟处理。例如,如果您在处理过程中调用第三方系统,并且它给您一个您知道是暂时的异常,那就太好了。但是,如果它给您一个错误,您知道这将是一个大问题,那么您可能会决定在系统中执行其他操作,而不仅仅是保留该消息。
您还可以查看“Defer
”方法。该方法实际上不允许该消息从队列中处理,除非它是通过其序列号专门拉取的。您的代码必须记住序列号值并提取它。但这并不完全是您所描述的。
另一个选择是您可以放弃 OnMessage、事件驱动的消息处理方式。虽然这非常有帮助,但您无法对事情进行太多控制。相反,连接您自己的处理循环并自行处理放弃/完成。您还需要处理 OnMessage 模式为您提供的一些线程/并发调用管理。这可能需要更多工作,但您拥有最大的灵 active 。
最后,我相信您对 AbandonAsync
进行的调用传递您想要修改的属性不起作用的原因是这些属性引用 Metadata properties在方法上,而不是 BrokeredMessage 上的标准属性。
关于azure - Azure 服务总线在重试消息之前是否可以延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536722/
目录 总线是什么? 常见总线类型有哪些? 总线的串行和并行的区别? 数据总线 地址总线
从下面的代码我在 map 上添加标记,每 15 秒刷新一次并从数据库中获取新的纬度和经度。标记(巴士图像)已成功添加到 map 上并从一个位置平稳移动到另一个位置,就像汽车在路上行驶一样。现在我想要的
如果在小端处理器上运行的程序将未缓存的值 0xaabbccdd 写入地址 0,并且处理器使用 32 位宽的 AXI4 总线,那么 WDATA 的第 31-24 位是 0xaa 还是 0xdd? AXI
是否存在用于将进程内服务消息传递给另一个服务的扭曲机制?我写了一个原型(prototype)总线,看起来像 from collections import defaultdict ch
我修改了设备树文件并使用 4 个 GPIO 引脚启用了 spi,这些引脚支持 pinmux 并从 gpio 切换到 spi 功能。但是在 Linux 内核代码中,代码如何知道使用了哪个 spi 总线/
我正在使用控创嵌入式计算机通过 I2C 与 ST 微 Controller 通信。我正在使用开发适配器与 I2C 接口(interface),使用描述的简单 read() 和 write() 函数 h
我有一个需要 PEC 的 I2C/SMBus 设备我正在为它编写一个内核空间驱动程序。 在 Linux 2.6.37 上我使用 i2c_board_info实例化客户端并在那里设置标志,但现在驱动程序
我想确认我的消息已经通过 socketCAN 库保存在 CAN 总线上。socketCAN 文档描述了使用 recvmsg() 函数时的这种可能性,我对其实现有疑问。 我要实现的功能是确认我的消息在仲
下面是我的代码 #import #import int main(int argc, const char *argv[]) { char *str = "First string";
在大量使用 D-Bus 的应用程序中获得更好的时间性能有哪些好的做法? ? 以下是我们的团队通过硬敲学校学到的一些知识: 尝试将数据实体组合成一个单一的大型结构/对象,以通过 D-Bus IPC 发送
我正在Akka内核下运行Akka应用程序,该程序在其他系统上也可以正常工作。 akka { loggers = ["akka.event.slf4j.Slf4jLogger"] log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是 C 语言新手,对于家庭作业考试,我必须实现一个简单的服务器套接字程序,该程序在循环中发送一些数据,并且如果客户端连接到服务器套接字(已使用 Arduino 完成,但需要相同的功能)在 raspb
我正在构建一个由许多(> 100)个相同节点组成的系统,所有节点均通过 CAN 总线连接。这个想法是所有节点必须具有相同的信息,任何节点都可以生成事件并通过 CAN 广播它。对于这些事件,CAN 帧提
您好,我在解析 IIB Toolkit 中的任何 JSON 时遇到问题。 java计算节点抛出的异常为:java.lang.NoClassDefFoundError: org.json.JSONObj
我买了这个传感器: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf 输出为“MaxDetect 1-w
我正在用户空间编写包装器 API,用于在嵌入式 Linux 平台上用 C 语言控制 I2C 总线。我能够使用 read() 和 write() 方法以及 ioctl() 调用来选择从属设备,从而从传感
在我的软件(用 C++ 编写)中,我使用 Linux 标准函数打开 CAN 总线套接字并执行 I/O 操作。 套接字的打开和使用如下: /* Create the socket */ if ((
每天——大约 5 到 10 次——我的 USB 摄像头从系统中消失。它从第一天开始就发生了,因为制造商驱动程序与 Linux 不兼容。 lsusb 和 dmesg 一开始正确显示,但在较长时间后有时会
我分发了包含多个 Go 服务的应用程序。其中一些使用 Kafka 作为数据总线。我能够使用 Jaeger 的 opentracing 追踪服务之间的调用。我在图表上绘制 Kafka 跨度时遇到问题,它
我是一名优秀的程序员,十分优秀!