队列消息未移至毒物队列
Queue messages not being moved to the poison queue
我有一份将文件导入系统的工作。每次导入文件时,我们都会在 azure 中创建一个 blob,然后将带有指令的消息发送到队列,以便数据相应地保存在 SQL 中。我们使用 azure-webjobs
和 azure-webjobssdk
.
来做到这一点
我们遇到了一个问题,在消息失败超过 7 次后,它们没有按预期移动到毒药队列。代码如下:
Program.cs
public class Program
{
static void Main()
{
//Set up DI
var module = new CustomModule();
var kernel = new StandardKernel(module);
//Configure JobHost
var storageConnectionString = AppSettingsHelper.Get("StorageConnectionString");
var config = new JobHostConfiguration(storageConnectionString) { JobActivator = new JobActivator(kernel), NameResolver = new QueueNameResolver() };
config.Queues.MaxDequeueCount = 7;
config.UseTimers();
//Pass configuration to JobJost
var host = new JobHost(config);
host.RunAndBlock();
}
}
Functions.cs
public class Functions
{
private readonly IMessageProcessor _fileImportQueueProcessor;
public Functions(IMessageProcessor fileImportQueueProcessor)
{
_fileImportQueueProcessor = fileImportQueueProcessor;
}
public async void FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
{
await _fileImportQueueProcessor.ProcessAsync(item);
}
}
_fileImportQueueProcessor.ProcessAsync(item)
引发异常,消息的出队计数已适当增加并重新处理。但是,它从未被移到毒物队列中。我附上了出队计数超过 50 的队列屏幕截图。
多次失败后,webjob 卡在等待重启状态,我无法停止或启动,最终我将其完全删除。在 运行 本地 webjob 之后,我看到正在处理消息(我假设出队计数超过 7 的消息应该已移至毒队列)。
关于为什么会发生这种情况以及可以做些什么来获得所需行为的任何想法。
谢谢,
更新
Vivien 的以下解决方案有效。
Matthew 非常友好地做了一个 PR 来解决这个问题。你可以查看 PR here.
弗雷德,
作为 async void
的 FileImportQueue 方法是问题的根源。
更新为return一个Task
:
public class Functions
{
private readonly IMessageProcessor _fileImportQueueProcessor;
public Functions(IMessageProcessor fileImportQueueProcessor)
{
_fileImportQueueProcessor = fileImportQueueProcessor;
}
public async Task FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
{
await _fileImportQueueProcessor.ProcessAsync(item);
}
}
dequeue 计数超过 50 的原因是因为当 _fileImportQueueProcessor.ProcessAsync(item) 抛出异常时它会导致整个过程崩溃。这意味着 WebJobs SDK 无法执行将消息移至有害队列的下一个任务。
当消息在队列中再次可用时,SDK 将再次处理它,依此类推。
我有一份将文件导入系统的工作。每次导入文件时,我们都会在 azure 中创建一个 blob,然后将带有指令的消息发送到队列,以便数据相应地保存在 SQL 中。我们使用 azure-webjobs
和 azure-webjobssdk
.
我们遇到了一个问题,在消息失败超过 7 次后,它们没有按预期移动到毒药队列。代码如下:
Program.cs
public class Program
{
static void Main()
{
//Set up DI
var module = new CustomModule();
var kernel = new StandardKernel(module);
//Configure JobHost
var storageConnectionString = AppSettingsHelper.Get("StorageConnectionString");
var config = new JobHostConfiguration(storageConnectionString) { JobActivator = new JobActivator(kernel), NameResolver = new QueueNameResolver() };
config.Queues.MaxDequeueCount = 7;
config.UseTimers();
//Pass configuration to JobJost
var host = new JobHost(config);
host.RunAndBlock();
}
}
Functions.cs
public class Functions
{
private readonly IMessageProcessor _fileImportQueueProcessor;
public Functions(IMessageProcessor fileImportQueueProcessor)
{
_fileImportQueueProcessor = fileImportQueueProcessor;
}
public async void FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
{
await _fileImportQueueProcessor.ProcessAsync(item);
}
}
_fileImportQueueProcessor.ProcessAsync(item)
引发异常,消息的出队计数已适当增加并重新处理。但是,它从未被移到毒物队列中。我附上了出队计数超过 50 的队列屏幕截图。
多次失败后,webjob 卡在等待重启状态,我无法停止或启动,最终我将其完全删除。在 运行 本地 webjob 之后,我看到正在处理消息(我假设出队计数超过 7 的消息应该已移至毒队列)。 关于为什么会发生这种情况以及可以做些什么来获得所需行为的任何想法。
谢谢,
更新
Vivien 的以下解决方案有效。
Matthew 非常友好地做了一个 PR 来解决这个问题。你可以查看 PR here.
弗雷德,
作为 async void
的 FileImportQueue 方法是问题的根源。
更新为return一个Task
:
public class Functions
{
private readonly IMessageProcessor _fileImportQueueProcessor;
public Functions(IMessageProcessor fileImportQueueProcessor)
{
_fileImportQueueProcessor = fileImportQueueProcessor;
}
public async Task FileImportQueue([QueueTrigger("%fileImportQueueKey%")] string item)
{
await _fileImportQueueProcessor.ProcessAsync(item);
}
}
dequeue 计数超过 50 的原因是因为当 _fileImportQueueProcessor.ProcessAsync(item) 抛出异常时它会导致整个过程崩溃。这意味着 WebJobs SDK 无法执行将消息移至有害队列的下一个任务。
当消息在队列中再次可用时,SDK 将再次处理它,依此类推。