如果我配置了服务总线代理消息接收器。它因任何原因失败了。我打电话给它
message.abandon();
但是这意味着该消息将再次返回队列/订阅。
我可以配置超时,之后队列中可以使用相同的消息进行处理。
例如:如果队列中只有一条消息。并且它失败了,那么每隔一分钟或每分钟继续处理就不好了。如果我配置的东西,可以确定,失败/被遗弃的消息只在30分钟后重新出现。那很有用。
有什么建议吗?
答案 0 :(得分:1)
当您放弃信息时,您无法提供“冷静”时间。该消息将立即可用。在MaxDeliveryCount
尝试用尽之前,它不会被删除。一旦所有这些处理尝试都用完了,消息就会转到死信队列。
如果您需要推迟邮件处理,可以选择几个选项。
推迟发送消息
您可以使用BrokeredMessage.DeferAsync()
推迟发送消息。该消息将返回队列以供将来处理,并将返回SequenceNumber
消息。使用这种方法的警告是需要保留SequenceNumber
以便稍后检索消息。如果您碰巧丢失了SequenceNumber
,仍然可以浏览延期消息并检索这些消息。更多信息here。
安排新的未来消息
另一种选择是克隆传入的失败消息,使用BrokeredMessage.ScheduledEnqueueTimeUTC
将其安排一段时间并完成原始消息。使用此选项,我建议使用send-via feature(也称为Transaction Processing)发送将来安排的新消息,以利用完成传入消息和发送传出消息的原子操作。这样,如果完成失败,代码将不会产生“重影”消息。更多information here。
使用客户端计划,而不是消息
另一种选择是安排使用客户端,而不是BrokeredMessage
使用您需要保留的client.ScheduleMessageAsync(). It will return a
SequenceNumber`,但使用此API可以在任何时间点取消消息等待计划时间到达或接收消息。更多information here。