移至 Poison Queue 的队列消息仍显示为队列计数,但保持隐藏状态
Queue messages that are moved to Poison Queue still show as queue count, but stay hidden
我正在测试我正在构建的 Webjob 的中毒消息处理。
一切似乎都按预期工作,除了一件奇怪的事情:
当一条消息被移动到“-poison”队列时,它的幽灵似乎仍然隐藏(不可见)在主作业队列中。这意味着如果我将 6 条有害消息移至“-poison”队列,存储资源管理器将显示“显示队列中 6 条消息中的 0 条”。我在存储资源管理器中看不到 6 条隐藏消息。
我尝试删除作业队列并重新创建它,但在我 运行 测试后奇怪的问题仍然存在。存储资源管理器显示“队列中显示 0 条消息,共 6 条消息”。
幕后发生了什么?
更新 1
我做了一些调查,我认为 WebJob SDK 不会删除有毒消息。
我浏览了 WebJob SDK 源代码,我认为这行代码由于某种原因没有被执行:
这是我的函数,可以帮助重现问题:
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("%QueueName%")] string message, TextWriter log)
{
if (message.Contains("Break"))
{
throw new Exception($"Error while processing message {message}");
}
log.WriteLine($"Processed message {message}");
}
}
更新 2
这是我正在使用的 WebJob SDK:
我也遇到了同样的问题
问题是当毒队列中的消息副本在没有可见时间的情况下通过 ref https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Host/Queues/QueueProcessor.cs#L145 并且当尝试从原始队列中删除消息时找不到服务 returns 404。是 azure-webjobs-sdk 中的问题,解决方案是进行此更改
await AddMessageAndCreateIfNotExistsAsync(poisonQueue, new CloudQueueMessage(message.AsString), cancellationToken);
在https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Host/Queues/QueueProcessor.cs#L145
我们等待这个修复的新版本
自定义解决方案
要解决此问题,请创建您自己的 CustomProcessor 并在 CopyMessageToPoisonQueueAsync 函数中从原始内容创建新的 CloudMessage 以传入毒物队列,请参见下面的示例。
var config = new JobHostConfiguration
config.Queues.QueueProcessorFactory = new CustomQueueProcessorFactory();
public QueueProcessor Create(QueueProcessorFactoryContext context)
{
// demonstrates how the Queue.ServiceClient options can be configured
context.Queue.ServiceClient.DefaultRequestOptions.ServerTimeout = TimeSpan.FromSeconds(30);
// demonstrates how queue options can be customized
context.Queue.EncodeMessage = true;
// return the custom queue processor
return new CustomQueueProcessor(context);
}
/// <summary>
/// Custom QueueProcessor demonstrating some of the virtuals that can be overridden
/// to customize queue processing.
/// </summary>
private class CustomQueueProcessor : QueueProcessor
{
private QueueProcessorFactoryContext _context;
public CustomQueueProcessor(QueueProcessorFactoryContext context)
: base(context)
{
_context = context;
}
public override async Task CompleteProcessingMessageAsync(CloudQueueMessage message, FunctionResult result, CancellationToken cancellationToken)
{
await base.CompleteProcessingMessageAsync(message, result, cancellationToken);
}
protected override async Task CopyMessageToPoisonQueueAsync(CloudQueueMessage message, CloudQueue poisonQueue, CancellationToken cancellationToken)
{
var msg = new CloudQueueMessage(message.AsString);
await base.CopyMessageToPoisonQueueAsync(msg, poisonQueue, cancellationToken);
}
protected override void OnMessageAddedToPoisonQueue(PoisonMessageEventArgs e)
{
base.OnMessageAddedToPoisonQueue(e);
}
}
据我所知,azure storage SDK 8.+ 不能很好地与 Azure webjobs SDK2.0 (related issue) 配合使用。
如果您使用存储 SDK 8.+,则有害消息会保持未删除但不可见的状态。
解决方法是使用低 Azure 存储 SDK 7.2.1。
它会很好用。
这个问题会在以后的SDK版本中解决。
对于仍然遇到此问题的任何人。自 2.1.0-beta1-10851 以来,这应该得到修复。缺点是目前还没有稳定发布的2.1.0版本。
我正在测试我正在构建的 Webjob 的中毒消息处理。
一切似乎都按预期工作,除了一件奇怪的事情:
当一条消息被移动到“-poison”队列时,它的幽灵似乎仍然隐藏(不可见)在主作业队列中。这意味着如果我将 6 条有害消息移至“-poison”队列,存储资源管理器将显示“显示队列中 6 条消息中的 0 条”。我在存储资源管理器中看不到 6 条隐藏消息。
我尝试删除作业队列并重新创建它,但在我 运行 测试后奇怪的问题仍然存在。存储资源管理器显示“队列中显示 0 条消息,共 6 条消息”。
幕后发生了什么?
更新 1
我做了一些调查,我认为 WebJob SDK 不会删除有毒消息。
我浏览了 WebJob SDK 源代码,我认为这行代码由于某种原因没有被执行:
这是我的函数,可以帮助重现问题:
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("%QueueName%")] string message, TextWriter log)
{
if (message.Contains("Break"))
{
throw new Exception($"Error while processing message {message}");
}
log.WriteLine($"Processed message {message}");
}
}
更新 2
这是我正在使用的 WebJob SDK:
我也遇到了同样的问题
问题是当毒队列中的消息副本在没有可见时间的情况下通过 ref https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Host/Queues/QueueProcessor.cs#L145 并且当尝试从原始队列中删除消息时找不到服务 returns 404。是 azure-webjobs-sdk 中的问题,解决方案是进行此更改
await AddMessageAndCreateIfNotExistsAsync(poisonQueue, new CloudQueueMessage(message.AsString), cancellationToken);
在https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Host/Queues/QueueProcessor.cs#L145
我们等待这个修复的新版本
自定义解决方案
要解决此问题,请创建您自己的 CustomProcessor 并在 CopyMessageToPoisonQueueAsync 函数中从原始内容创建新的 CloudMessage 以传入毒物队列,请参见下面的示例。
var config = new JobHostConfiguration
config.Queues.QueueProcessorFactory = new CustomQueueProcessorFactory();
public QueueProcessor Create(QueueProcessorFactoryContext context)
{
// demonstrates how the Queue.ServiceClient options can be configured
context.Queue.ServiceClient.DefaultRequestOptions.ServerTimeout = TimeSpan.FromSeconds(30);
// demonstrates how queue options can be customized
context.Queue.EncodeMessage = true;
// return the custom queue processor
return new CustomQueueProcessor(context);
}
/// <summary>
/// Custom QueueProcessor demonstrating some of the virtuals that can be overridden
/// to customize queue processing.
/// </summary>
private class CustomQueueProcessor : QueueProcessor
{
private QueueProcessorFactoryContext _context;
public CustomQueueProcessor(QueueProcessorFactoryContext context)
: base(context)
{
_context = context;
}
public override async Task CompleteProcessingMessageAsync(CloudQueueMessage message, FunctionResult result, CancellationToken cancellationToken)
{
await base.CompleteProcessingMessageAsync(message, result, cancellationToken);
}
protected override async Task CopyMessageToPoisonQueueAsync(CloudQueueMessage message, CloudQueue poisonQueue, CancellationToken cancellationToken)
{
var msg = new CloudQueueMessage(message.AsString);
await base.CopyMessageToPoisonQueueAsync(msg, poisonQueue, cancellationToken);
}
protected override void OnMessageAddedToPoisonQueue(PoisonMessageEventArgs e)
{
base.OnMessageAddedToPoisonQueue(e);
}
}
据我所知,azure storage SDK 8.+ 不能很好地与 Azure webjobs SDK2.0 (related issue) 配合使用。
如果您使用存储 SDK 8.+,则有害消息会保持未删除但不可见的状态。
解决方法是使用低 Azure 存储 SDK 7.2.1。
它会很好用。
这个问题会在以后的SDK版本中解决。
对于仍然遇到此问题的任何人。自 2.1.0-beta1-10851 以来,这应该得到修复。缺点是目前还没有稳定发布的2.1.0版本。