Man*_*kar 0 c# azure azureservicebus azure-servicebus-queues
如果我配置了服务总线代理消息接收器。并且由于任何原因它都会失败。我呼吁它
message.abandon();
Run Code Online (Sandbox Code Playgroud)
但这意味着该消息将再次返回到队列/订阅中。
我可以配置一个超时,之后队列中可以处理相同的消息。
例如:如果队列中只有一条消息。如果它失败了,那么继续每秒或每分钟处理它是不好的。如果我配置一些东西,可以确保失败/放弃的消息仅在 30 分钟后重新出现。那么它是有用的。
有什么建议么?
当您放弃消息时,您无法提供“冷静”时间。该消息将立即可用。MaxDeliveryCount在尝试用尽之前,它不会成为死信。一旦所有这些处理尝试都用完,消息将进入死信队列。
如果您需要推迟消息处理,有多种选择。
推迟消息
您可以使用 推迟消息BrokeredMessage.DeferAsync()。该消息将返回队列以供将来处理,并SequenceNumber返回该消息的一部分。这种方法的警告是需要保留 以便SequenceNumber稍后检索消息。如果您碰巧丢失了SequenceNumber,仍然可以浏览延迟的消息并检索它们。更多信息请参见此处。
安排新的未来消息
另一种选择是克隆传入的失败消息,将其安排在将来的某个时间使用BrokeredMessage.ScheduledEnqueueTimeUTC并完成原始消息。使用此选项,我建议使用send-via 功能(也称为事务处理)发送计划在将来分派的新消息,以利用完成传入消息和发送传出消息的原子操作。这样,如果完成失败,代码将不会产生“幽灵”消息。更多信息请参见此处。
使用客户端而不是消息进行调度
另一种选择是使用客户端进行调度,而不是BrokeredMessage使用client.ScheduleMessageAsync(). It will return a您需要保留的 SequenceNumber`,但使用此 API 可以在任何时间点取消消息,无需等待调度时间到达或接收消息。更多信息请参见此处。