我有一份将文件导入系统的工作。每次导入文件时,我们都会在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陷入Pending Restart状态,我无法停止或启动,我最终完全删除了它。在本地运行webjob之后,我看到了正在处理的消息(我假设出队计数超过7的那个应该已经被移动到毒性队列中)。 关于为什么会发生这种情况以及可以采取哪些措施来获得理想行为的任何想法。
谢谢,
更新 Vivien的解决方案起了作用 马修很友好地做了一个可以解决这个问题的公关。您可以查看PR here.
答案 0 :(得分:4)
佛瑞德,
作为async void
的FileImportQueue方法是您问题的根源。
更新它以返回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将再次处理它,依此类推。