C# 未将队列消息移动到毒药队列

C# 未将队列消息移动到毒药队列,c#,azure,azure-webjobs,azure-webjobssdk,azure-storage-queues,C#,Azure,Azure Webjobs,Azure Webjobssdk,Azure Storage Queues,我有一个将文件导入系统的工作。每次导入文件时,我们都会在azure中创建一个blob,并向队列发送一条带有指令的消息,以便相应地将数据保存在SQL中。我们使用azurewebjobs和azurewebjobsdk来实现这一点 我们遇到了一个问题,消息失败超过7次后,它们没有按预期移动到poision队列。代码如下: Program.cs public class Program { static void Main() { //Set up DI

我有一个将文件导入系统的工作。每次导入文件时,我们都会在azure中创建一个blob,并向队列发送一条带有指令的消息,以便相应地将数据保存在SQL中。我们使用
azurewebjobs
azurewebjobsdk
来实现这一点

我们遇到了一个问题,消息失败超过7次后,它们没有按预期移动到poision队列。代码如下:

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();
    }
}
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);
    }

}
函数.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();
    }
}
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);
    }

}
\u fileimportqueeprocessor.ProcessAsync(item)
引发异常,消息的出列计数已正确增加并重新处理。然而,它从未被移动到毒药队列。我附上了一张排队的屏幕截图,排队人数超过50人

在多次失败后,webjob被困在挂起的重新启动状态,我无法停止或启动,最终将其完全删除。在本地运行webjob之后,我看到消息正在被处理(我假设出列计数超过7的消息应该被移动到中毒队列)。 任何关于为什么会发生这种情况的想法,以及可以采取什么措施来实现所需的行为

谢谢

更新 下面的Vivien解决方案有效。
Matthew很热心地做了一个公关来解决这个问题。你可以看看公关

弗雷德

FileImportQueue方法是
异步void
,这是问题的根源

更新它以返回一个
任务

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);
    }
}
出列计数超过50的原因是,当_fileimportqueeprocessor.ProcessAsync(item)引发异常时,它将使整个进程崩溃。这意味着WebJobs SDK无法执行将消息移动到毒药队列的下一个任务

当消息在队列中再次可用时,SDK将再次处理它,依此类推。

Fred

FileImportQueue方法是
异步void
,这是问题的根源

更新它以返回一个
任务

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);
    }
}
出列计数超过50的原因是,当_fileimportqueeprocessor.ProcessAsync(item)引发异常时,它将使整个进程崩溃。这意味着WebJobs SDK无法执行将消息移动到毒药队列的下一个任务


当消息在队列中再次可用时,SDK将再次处理它,以此类推。

漂亮,捕捉得好!谢谢,这很有道理,我会继续测试你的解决方案,如果它有效,我会将此标记为答案。仅供参考-这经常作为用户错误出现,因此我将抛出一个索引错误以尽早捕获这些错误。请参阅PR。@mathewc谢谢您提供的信息。实际上,我只是在sandobox环境中复制了这个,在Vivien改变后,这个效果正如预期的一样。漂亮,漂亮的捕捉!谢谢,这很有道理,我会继续测试你的解决方案,如果它有效,我会将此标记为答案。仅供参考-这经常作为用户错误出现,因此我将抛出一个索引错误以尽早捕获这些错误。请参阅PR。@mathewc谢谢您提供的信息。实际上,我只是在sandobox环境中复制了这一点,在Vivien改变后,这一切都如期进行。