我有一个将文件导入系统的工作。每次导入文件时,我们都会在azure中创建blob,并向队列发送带有指令的消息,以便相应地将数据保存在SQL中。我们使用azure-webjobs和azure-webjobssdk来完成这个任务。
我们经历了一个问题,在消息失败超过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();
}
}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下面的解决方案起作用了。
马修很好地做了一次公关来解决这个问题。您可以查看PR 这里。。


发布于 2017-01-26 16:34:39
弗雷德,
FileImportQueue方法是一个async void,是问题的根源。
更新它以返回一个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);
}
}排队列计数超过50的原因是,当_fileImportQueueProcessor.ProcessAsync(item)抛出异常时,它将导致整个进程崩溃。这意味着WebJobs SDK无法执行下一个将消息移动到毒队列的任务。
当消息在队列中再次可用时,SDK将再次处理它,依此类推。
https://stackoverflow.com/questions/41876364
复制相似问题