![](/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.