首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未移动到毒队列的队列消息

未移动到毒队列的队列消息
EN

Stack Overflow用户
提问于 2017-01-26 15:01:09
回答 1查看 2K关注 0票数 1

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

我们经历了一个问题,在消息失败超过7次之后,它们没有像预期的那样移动到poision队列。守则如下:

Program.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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下面的解决方案起作用了。

马修很好地做了一次公关来解决这个问题。您可以查看PR 这里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 16:34:39

弗雷德,

FileImportQueue方法是一个async void,是问题的根源。

更新它以返回一个Task

代码语言:javascript
复制
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的原因是,当_fileImportQueueProcessor.ProcessAsync(item)抛出异常时,它将导致整个进程崩溃。这意味着WebJobs SDK无法执行下一个将消息移动到毒队列的任务。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41876364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档