C# 未将队列消息移动到毒药队列
我有一个将文件导入系统的工作。每次导入文件时,我们都会在azure中创建一个blob,并向队列发送一条带有指令的消息,以便相应地将数据保存在SQL中。我们使用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
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改变后,这一切都如期进行。