队列消息未移至毒物队列

Queue messages not being moved to the poison queue

我有一份将文件导入系统的工作。每次导入文件时,我们都会在 azure 中创建一个 blob,然后将带有指令的消息发送到队列,以便数据相应地保存在 SQL 中。我们使用 azure-webjobsazure-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 将再次处理它,依此类推。