hereとhereのドキュメントによると、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
}