我有幾個帶有ServiceBus觸發器的WebJobs,並且我有一個自定義MessageProcessor在消息處理完成後執行一些處理。Azure Webjobs ServiceBusTrigger - 在達到MaxDeliveryCount時執行不同的功能
如果消息在最後一次重試時,我希望能夠做一些不同的事情(特別是記錄一個錯誤,而不是一個警告),即它正準備發送到死信隊列。發送到CompleteProcessingMessageAsync函數的BrokeredMessage具有DeliveryCount,但我無法看到返回原始隊列以查找MaxDeliveryCount的方法。有任何想法嗎?不同的隊列有不同的MaxDeliveryCounts,因此設置常量不是真正的選擇。我唯一能想到的其他事情是爲每個隊列的死信隊列創建一個單獨的作業,但我希望能夠在WebJob級別完成,而不是爲每個單獨的作業完成。
public class CustomMessageProcessor : MessageProcessor
{
public CustomMessageProcessor(OnMessageOptions messageOptions) : base(messageOptions)
{
}
public override async Task CompleteProcessingMessageAsync(BrokeredMessage message, FunctionResult result, CancellationToken cancellationToken)
{
if (result.Succeeded)
{
if (!MessageOptions.AutoComplete)
{
cancellationToken.ThrowIfCancellationRequested();
await message.CompleteAsync();
}
}
else
{
cancellationToken.ThrowIfCancellationRequested();
//some other processing
//If message.DeliveryCount < maxDeliveryCount
// log warning
//else
// log error
await message.AbandonAsync();
}
}
}
但是,如何確定消息來自哪個隊列? –
@ anthony-keenan它取決於 - 你如何連接你的自定義消息處理器?你知道哪個處理器實例綁定到哪個隊列嗎?我沒有對這部分SDK的直接經驗,但我的理解是,當自定義消息處理器連線時(例如通過消息傳遞提供者),您應該看到類似於「實體路徑」的內容 - 如果是,則應將其傳遞到您的處理器實例,然後用於引用緩存/共享集合中的隊列。 –
自定義消息處理器覆蓋作爲Webjobs框架一部分的消息處理器。它在webjob進程的每條消息之前和之後被調用,不幸的是,它是全局的,而不是隊列特定的,並且從我所看到的隊列路徑不在代理消息中,所以我無法從那裏查找隊列。 –