Как сказал Джош, вы можете просто клонировать исходное сообщение, настроить запланированное время постановки в очередь, отправить клон и завершить оригинал.
Жаль, что отправка клона и завершение оригинала не является атомарной операцией, поэтому очень маловероятно, что мы увидим оригинал снова в случае сбоя процесса обработки в самый неподходящий момент.
И другая проблема заключается в том, что DeliveryCount
на клоне будет всегда равным 1 , потому что это совершенно новое сообщение. Таким образом, мы могли бы бесконечно повторять и никогда не зацикливаться на этом сообщении.
К счастью, это можно исправить, добавив наш счетчик повторных отправок в качестве свойства сообщения:
[FunctionName("DelayMessage")]
public static async Task DelayMessage([ServiceBusTrigger("MyQueue", AccessRights.Listen, Connection = "MyConnection")]BrokeredMessage originalMessage,
[ServiceBus("MyQueue", AccessRights.Send, Connection = "MyConnection")]IAsyncCollector<BrokeredMessage> newMessages,TraceWriter log)
{
//handle any kind of error scenerio
int resubmitCount = originalMessage.Properties.ContainsKey("ResubmitCount") ? (int)originalMessage.Properties["ResubmitCount"] : 0;
if (resubmitCount > 5)
{
Console.WriteLine("DEAD-LETTERING");
originalMessage.DeadLetter("Too many retries", $"ResubmitCount is {resubmitCount}");
}
else
{
var newMessage = originalMessage.Clone();
newMessage.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(5);
await newMessages.AddAsync(newMessage);
}
}
Для более подробной информации, вы можете обратиться к этой статье .
Кроме того, довольно легко реализовать следующий шаблон ожидания / повтора / удаления очереди в LogicApp, так как этот тип управления потоком - это именно то, для чего были разработаны LogicApps. Пожалуйста, обратитесь к этому SO поток .