问题描述
问题::我需要在用户定义了经过时间作为接收者之后,重新安排/推迟要处理的消息。
目标:ServerUnavailable的HttpReponseException之后,我想在30分钟后重试该消息。它也必须遵循规则设置,即尝试10次传递后,邮件将被发送到死信队列(根据主题规则自动发生)。
因此,我有一个功能应用程序来处理Azure Service Bus主题。这意味着线程休眠是不可选择的。
我尝试过的事情:
- 我知道发件人使用
messageSender.ScheduleMessageAsync(message,dateTime)
来安排消息以便以后处理,这在发送新消息时有效,但是,作为接收者,我希望在发生异常后在我这一边进行处理。 - 我尝试使用
messageReceiver.DeferAsync(message.SystemProperties.LockToken,properties)
(包含新的“ ScheduledEnqueueTimeUtc”)的属性,但这确实延迟了消息,但是序列ID 似乎不同步,无法接收我的延迟消息 - 如果克隆消息,则无法设置
SystemProperty.DeliveryCount
,因为它是只读的,因此,死信队列规则将无法正常工作。我可以在我的功能应用程序中创建UserProperty's
并手动计算消息的联系和预定的日期,但是我想知道是否有更好的方法可以做到这一点?
任何建议都会被采纳。
解决方法
您对创建重试策略有何看法?而不是thread.sleep,您可以在队列中的其他时间处理同一条消息,但要指定+30分钟的时间, 然后返回肯定的响应以清除当前消息,
您需要保留deliveryCount的规则,因此您可能需要将具有计数的属性添加到消息队列中?
我认为这个想法很合逻辑,here是可以为您提供帮助的文章,您需要使用ScheduleMessageAsync来更改thread.sleep。
,我设法解决了使用自定义UserProperties
重试邮件的问题。
这与侯赛姆·德比拉(Houssem Dbira)的建议以及我的第3点一致,但我没有使用自定义重试策略对象,而是创建了一个帮助程序功能来管理重试计数以及将消息重新安排到服务总线。
如果您有兴趣自己做,下面的链接将带您进入我创建的帮助函数。