我也一直使用Azure存储队列来发布消息,然后将消息写入db表。但是,我注意到,当在队列上处理消息时出现错误,消息就会被写入有毒队列。
下面是我的应用程序设置的一些背景知识:
Azure Web App ->将消息写入队列
Azure函数->队列触发器处理消息并将内容写入数据库
db架构存在问题,导致插入失败。每条消息被重试5次,我相信这是重试队列消息的默认设置,在第5次重试之后,消息被放入有毒队列。
db模式随后得到了修复,但现在我无法处理有毒队列上的消息。
我的问题是,我们是否可以恢复写入有毒队列的消息,以便处理它们并将它们插入到数据库中,如果是这样的话,如何恢复它们?
发布于 2017-10-23 21:43:33
对于你的特殊问题,我会推荐这篇文章的问题部分提到的解决方案:Azure: How to move messages from poison queue to back to main queue?
请注意有毒队列== $"{queueName}-poison"的名称
发布于 2018-10-19 20:25:31
在我当前的项目中,我在FunctionApp中创建了所谓的“支持函数”。它公开一个特殊的HTTP端点,该端点具有管理员授权级别,可以在任何时候执行。
请参考下面的代码,它解决了重新处理来自有毒队列的消息的问题:
public static class QueueOperations
{
[FunctionName("Support_ReprocessPoisonQueueMessages")]
public static async Task<IActionResult> Support_ReprocessPoisonQueueMessages([HttpTrigger(AuthorizationLevel.Admin, "put", Route = "support/reprocessQueueMessages/{queueName}")]HttpRequest req, ILogger log,
[Queue("{queueName}")] CloudQueue queue,
[Queue("{queueName}-poison")] CloudQueue poisonQueue, string queueName)
{
log.LogInformation("Support_ReprocessPoisonQueueMessages function processed a request.");
int.TryParse(req.Query["messageCount"], out var messageCountParameter);
var messageCount = messageCountParameter == 0 ? 10 : messageCountParameter;
var processedMessages = 0;
while (processedMessages < messageCount)
{
var message = await poisonQueue.GetMessageAsync();
if (message == null)
break;
var messageId = message.Id;
var popReceipt = message.PopReceipt;
await queue.AddMessageAsync(message); // a new Id and PopReceipt is assigned
await poisonQueue.DeleteMessageAsync(messageId, popReceipt);
processedMessages++;
}
return new OkObjectResult($"Reprocessed {processedMessages} messages from the {poisonQueue.Name} queue.");
}
}或者,使用附加元数据创建一个新消息可能是一个好主意(作为消息在过去已经被处理但没有成功的信息-然后它可以被发送到死信队列)。
发布于 2017-10-23 21:50:36
您有两个选择
https://stackoverflow.com/questions/46889743
复制相似问题