2017-02-23 17 views
1

herehereのドキュメントによると、this oneのような多くの質問があります。私の理解では、キューに入れられたメッセージがこの回数で失敗すると、現在のキューに入れて自動的に毒キューに入れます。Azureがキューを削除しようとしました。

残念ながら私の限られた経験では、ジョブが最大デキューカウントに失敗した場合、自動的にポイズンキューに追加されますが、元のキューからは削除されず、明らかに再処理されるため、 10分後に同じメッセージを毒キューに追加し、重複を作成してもそれを削除しません。例外は、例外なしに5回とメソッドの終了を投げているとき

私はDeleteMessageAsyncを上書きしながら、カスタムQueueProcessorを作成し、自分のIQueueProcessorFactoryクラスを実装するとき、私は方法を確認することができましたが呼び出されているが、キュー内のメッセージが残っています。私はまた、通常と毒の両方のキューを削除しようとしました。

私が使用しているコード:メッセージは、元のキューに残っていることを除き、予想通り

public class Program 
{ 
    private const string QUEUE_NAME = "some-queue"; 

    // Please set the following connection strings in app.config for this WebJob to run: 
    // AzureWebJobsDashboard and AzureWebJobsStorage 
    static void Main() 
    { 
     var config = new JobHostConfiguration(); 

     config.Queues.QueueProcessorFactory = new CustomFactory(); 
     var host = new JobHost(config); 
     // The following code ensures that the WebJob will be running continuously 
     host.RunAndBlock(); 
    } 

    private class CustomFactory : IQueueProcessorFactory 
    { 
     public QueueProcessor Create(QueueProcessorFactoryContext context) 
     { 
      return new CustomQueueProcessor(context); 
     } 

     private class CustomQueueProcessor : QueueProcessor 
     { 
      public CustomQueueProcessor(QueueProcessorFactoryContext context) : base(context) 
      { 

      } 

      protected override Task DeleteMessageAsync(CloudQueueMessage message, CancellationToken cancellationToken) 
      { 
       return base.DeleteMessageAsync(message, cancellationToken); 
      } 
     } 
    } 

    public static void QueueTrigger([QueueTrigger(QUEUE_NAME)] CloudQueueMessage message) 
    { 
     Console.WriteLine($"Processing message: {message.AsString}"); 
     throw new Exception("test exception"); 
    } 
} 

すべてが動作します。私は間違いがあると思っています。エラーは私の目的です。それは、私が待ち行列に乗っていないために見落としたばかげた愚かなことですが、情報のためにインターネットを這う2日間を過ごした後、何をするか、次に試してみてください。

編集

我々はサービスバスで行く終わるでしたが、それは我々がキュー自身がキュー・トリガー内から半で管理したことの代替を思い付いたことは注目に値します。

デキューカウントを確認することでしたが、最大デキュー(再試行)カウントを上回っている場合は、単に戻ります。これは、メッセージが "正常に"処理された後にキューからメッセージを削除したことを発信者に伝えます。このアプローチでは、メッセージが10分後に通常のキューから削除される間にポイズンキューに追加されるという点で、ほぼ予想される動作になります。

パッケージの将来のリリースや、キュー自体のアップデートで、元の問題を修正するという利点が追加されました。

public class Program 
{ 
    private const int MAX_DEQUEUE_COUNT = 5; 

    static void Main() 
    { 
     var config = new JobHostConfiguration(); 
     ... 
     config.Queues.MaxDequeueCount = MAX_DEQUEUE_COUNT; 
     ... 
    } 

    public static void QueueTrigger([QueueTrigger("some-queue")] CloudQueueMessage message) 
    { 
     if (message.DequeueCount > MAX_DEQUEUE_COUNT) 
     { 
      // prevents the message from indefinitely retrying every 10 minutes and ultimately creating duplicates within the poison queue. 
      return; 
     } 

     // do stuff 
    } 

答えて

0

私はあなたに個人的な経験と私がStackOverflowで見たことに基づいて参照されていない答えを与えるつもりです。あなたは、WebJob QueueTriggerAttributesに関する自動デッドレター処理と最大デキューカウントを尊重する問題を最初に持っている人ではありません。私の推奨は、サービスキューとサービスバストリガの使用に賛成してストレージキュー+キュートリガのフレークさを回避することです。

メッセージングテクノロジとして、サービスバスキューは完全に機能し、コストに匹敵します。ストレージバスをサービスバスキュー経由で使用する唯一の理由は、80GB以上のメッセージを格納する必要がある場合です。これは、パーティション化によるサービスバスキューの制限です。

0

同じ現象が発生し、webjobs sdk(v2)とストレージクライアントライブラリv8.xの間で発生したバグが原因です。

2.1.0-beta1-10851から固定されています。欠点は、2.1.0の安定したリリース版が現在存在しないことです。

関連する問題