我有一个简单的函数,它从队列中获取消息并将其保存到存储表中。我希望在某些情况下,已经存在具有相同数据的表实体。因此,我添加了一个异常处理来跳过这种情况,并将队列消息标记为已处理。尽管现在处理了异常,但脚本命令会告诉我一个错误,并且消息仍然在队列中。
我认为这是因为我在主机和我的代码之间使用了表绑定。我对吗?我应该在代码中使用表客户端而不是绑定吗?有不同的方法吗?
产生这种情况的示例代码:
[FunctionName("MyFunction")]
public static async Task Run([QueueTrigger("myqueue", Connection = "Conn")]string msg, [Table("mytable", Connection = "Conn")] IAsyncCollector<DataEntity> dataEntity, TraceWriter log)
{
try
{
await dataEntity.AddAsync(new DataEntity()
{
PartitionKey = "1",
RowKey = "1",
Data = msg
});
await dataEntity.FlushAsync();
}
catch (StorageException e)
{
// when it is an exception that informs "entity already exists" skip it
}
}
答案 0 :(得分:2)
当队列触发器功能失败时,对于给定的队列消息, Azure Functions重试最多五次,包括第一次尝试。
如果所有五次尝试都失败,则函数运行时会将消息添加到名为<originalqueuename>-poison
的队列中。
您可以编写一个函数来处理来自poison queue的消息,方法是记录消息或发送需要手动关注的通知。
host.json文件包含控制队列触发器行为的设置:
{
"queues": {
"maxPollingInterval": 2000,
"visibilityTimeout" : "00:00:30",
"batchSize": 16,
"maxDequeueCount": 1,
"newBatchThreshold": 8
}
}
注意: maxDequeueCount默认值为5 。在将消息移动到毒性队列之前尝试处理消息的次数。根据需要,您可以设置"maxDequeueCount":1
。
这些设置也是主机范围,适用于所有功能。你目前无法控制这些功能。