尽管捕获异常,但仍出现ScriptHost错误

时间:2018-04-29 08:24:09

标签: azure azure-functions

我有一个简单的函数,它从队列中获取消息并将其保存到存储表中。我希望在某些情况下,已经存在具有相同数据的表实体。因此,我添加了一个异常处理来跳过这种情况,并将队列消息标记为已处理。尽管现在处理了异常,但脚本命令会告诉我一个错误,并且消息仍然在队列中。

我认为这是因为我在主机和我的代码之间使用了表绑定。我对吗?我应该在代码中使用表客户端而不是绑定吗?有不同的方法吗?

产生这种情况的示例代码:

    [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
        } 
    }

1 个答案:

答案 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

这些设置也是主机范围,适用于所有功能。你目前无法控制这些功能。