2017-06-26 47 views
4

我有幾個帶有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(); 
     } 
    } 
} 

回答

1

你應該能夠獲得從父隊列Microsoft.ServiceBus.Messaging.QueueDescription,然後用MaxDeliveryCount關閉它。唯一的問題是獲取隊列描述是一個相對昂貴的操作,所以我建議一開始就這樣做,並緩存每個隊列的值。

+0

但是,如何確定消息來自哪個隊列? –

+0

@ anthony-keenan它取決於 - 你如何連接你的自定義消息處理器?你知道哪個處理器實例綁定到哪個隊列嗎?我沒有對這部分SDK的直接經驗,但我的理解是,當自定義消息處理器連線時(例如通過消息傳遞提供者),您應該看到類似於「實體路徑」的內容 - 如果是,則應將其傳遞到您的處理器實例,然後用於引用緩存/共享集合中的隊列。 –

+0

自定義消息處理器覆蓋作爲Webjobs框架一部分的消息處理器。它在webjob進程的每條消息之前和之後被調用,不幸的是,它是全局的,而不是隊列特定的,並且從我所看到的隊列路徑不在代理消息中,所以我無法從那裏查找隊列。 –

0

不同的隊列獲得不同MaxDeliveryCounts,所以設定恆定是不是一個真正的選擇

由於斯拉瓦Asipenko提到,我們可以設置MaxDeliveryCount爲servicebus隊列。

我怎麼找出哪個隊列消息從

來到我們能得到的消息屬性知道隊列名稱,如果我們在發送過程中設置。以標籤爲例:

var message = new BrokeredMessage(object); 
message.Label = "queue name"; 
client.Send(message); 
+0

我正在處理的消息實際上是通過主題發佈的。因此,您可以將發送端的主題名稱設置爲消息標籤,但MaxDeliveryCount是特定於隊列的,並且您不知道正在處理哪個隊列。這似乎也很混亂,改變了發送方以彌補接收方的不足。 –

+0

我們也可以設置[MaxDeliveryCount](https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.subscriptiondescription.maxdeliverycount?view=azure-dotnet#Microsoft_ServiceBus_Messaging_SubscriptionDescription_MaxDeliveryCount)進行申請。我們還可以爲消息添加屬性,例如'message.Properties [「subcriptionName」] =「訂閱名稱」; –