重新执行
向队列添加消息(大约500条消息)。 添加一个队列触发的功能应用程序,它将处理队列消息。
预期行为
处理队列中的所有消息。如果在处理消息时抛出异常,则会将消息发送到毒性队列。
实际行为
消息开始处理。经过一段时间(大约30-60秒),队列中剩余的所有消息都将被移动到毒性队列中。在那一刻处理的消息不会引发异常。
我们检查了一个队列消息生命周期是默认消息: 7天。 我们尝试将 WindowsAzure.Storage 程序包降级为 7.2.1 ,但没有成功。
我们使用的WindowsAzure.Storage版本是8.5.0。
可能是应用程序崩溃,这会导致所有消息都被移动到毒药队列吗?
修改
这是消息添加到队列的方式:
public async Task AddMessage()
{
var queueModel = new QueueModel
{
// queue model properties
};
await AddMessageToQueueAsync(queueModel);
}
public async Task AddMessageToQueueAsync(T messageObject, TimeSpan? initialVisibilityDelay = null)
{
var queue = GetQueue();
var jsonMessage = JsonConvert.SerializeObject(messageObject);
var message = new CloudQueueMessage(jsonMessage);
await queue.AddMessageAsync(message, TimeSpan.FromDays(7), initialVisibilityDelay, new QueueRequestOptions(), new OperationContext());
}
private CloudQueue GetQueue()
{
var queueClient = _storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference(_queueName);
queue.CreateIfNotExists();
return queue;
}
这是处理消息的功能应用程序:
[FunctionName("ProcessQueue")]
public static async Task Run([QueueTrigger("queue-name", Connection = "AzureWebJobsStorage")]string queueItem, TraceWriter log)
{
if (String.IsNullOrEmpty(queueItem))
{
return;
}
var queueModel = JsonConvert.DeserializeObject<QueueModel>(queueItem);
if (queueModel == null)
{
return;
}
try
{
// process the message
}
catch (Exception ex)
{
// message is moved to the poison-queue but no exception is thrown
log.Error(ex.Message, ex);
}
}
答案 0 :(得分:0)
发现了这个问题。问题是一个剩余的功能应用程序,它侦听同一个队列并与当前的功能应用程序并行处理消息。因为两个功能应用程序都处理来自同一队列的消息,所以在某些时候,队列中剩余的消息都被移动到了毒药队列。 (从队列中读取消息时可能存在一些并发问题)。