2017-06-26 7 views
4

ServiceBusトリガーを持つWebJobがいくつかありますが、処理が完了した後に処理するには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たちはservicebusキューのMaxDeliveryCountを設定することができると述べたようにオプション

ではありません。私はメッセージをキューにどのうまくやる方法を

は、我々は、送信時にそれを設定した場合、メッセージ・プロパティは、キュー名を知ってもらうことができ

から来ました。ラベルを取る:

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 "] ="サブスクリプション名 "など、メッセージのプロパティを追加することもできます。 –

関連する問題