我尝试使用ServiceBus订阅的MaxDeliveryCount来实现邮件处理的重试。不确定这是最好的主意,但不想丢失消息。
场景:
第一条消息(" 1")无法在B上处理并被标记为已放弃(BrokeredMessage.Abandon())
原因:由于内部原因,应用现在无法处理此消息。
自DeliveryCount<之后,它还没有BlackLettered MaxDeliveryCount)
然后留言" 3"收到了 消息" 3"也被标记为已放弃,因为消息" 1"是 预期
依此类推。
在这种情况下,似乎SB正在以循环方式传递消息。
这是ServiceBus的预期行为吗?
我知道是否存在一些争论,SB是否保证有序交付。对于应用程序来说,按照发送消息的顺序处理消息非常重要。
任何想法如何重新处理消息" 1"可以在DeliveryCount达到MaxDeliveryCount之前执行,然后再处理消息" 2"?
答案 0 :(得分:0)
首先,正如Thomas在评论中所说,您可以尝试为主题指定SupportOrdering property到 true 。
TopicDescription td = new TopicDescription("TopicTest");
td.SupportOrdering = true;
如果订阅客户端收到一条消息并调用Abandon
方法放弃对隐藏锁定消息的锁定,我们可以再次调用Receive
方法再次获取它,就像这样。
输出:
另一方面,如果可能,您可以尝试将完整的工作步骤与单个消息中的特定订单相结合,而不是在多个消息中拆分步骤,然后您可以控制处理在您的代码逻辑中按特定顺序,而不是在服务总线基础结构上回复以提供此保证。