![](/img/trans.png)
[英]Is there a way I can delay the retry for a service bus message in an Azure function?
[英]Delay Message and Maintain Delivery Count Azure Service Bus
当我们从 Azure 服务总线队列中提取消息时,我们有一个场景,并且由于某种原因,如果向下 stream 之一关闭,而不是我们希望延迟消息并放回队列。 我知道我们可以通过多种方式(设置属性 ScheduledEnqueueTime 或使用 Schedule API)但无论哪种方式,我们都必须创建一条新消息并放回队列,这将丢失传递计数,也可能导致我们遇到的问题重复消息,其中发送克隆和完成原始消息不是原子操作,其中一个失败。
https://www.markheath.net/post/defer-processing-azure-service-bus-message
根据上面的文章,唯一的方法似乎是拥有我们的自定义属性,这仍然是唯一的方法,因为这篇文章是在 2016 年写的。
重新安排新邮件不会增加传递计数。 正如您所说,发送消息和完成消息不是原子的,它可以在事务的帮助下是原子的,从而确保属于给定操作组的所有操作共同成功或失败。
这是一个例子:
ServiceBusClient client = new ServiceBusClient("<connection-string>");
ServiceBusReceiver serviceBusReceiver = client.CreateReceiver("<queue>");
ServiceBusSender serviceBusSender = client.CreateSender("<queue>");
var message = await serviceBusReceiver.ReceiveMessageAsync();
// Your condition to handle the down stream
if (true)
{
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await serviceBusReceiver.CompleteMessageAsync(message);
var newMessage = new ServiceBusMessage(message);
newMessage.ScheduledEnqueueTime = new DateTimeOffset(DateTime.UtcNow.AddMinutes(1));
await serviceBusSender.SendMessageAsync(newMessage);
ts.Complete();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.