首页 > 解决方案 > Azure 函数和队列

问题描述

我有一个功能:

    public async static Task Run([QueueTrigger("efs-api-call-last-datetime", Connection = "StorageConnectionString")]DateTime queueItem,
        [Queue("efs-api-call-last-datetime", Connection = "StorageConnectionString")]CloudQueue inputQueue,
        TraceWriter log)
    {

然后我有很长的过程来处理来自队列的消息。问题是消息将在 30 秒后被读取到队列中,而我正在处理此消息。我不需要添加此消息并对其进行两次处理。我想要这样的代码:

        try
        {
             // long operation
        }
        catch(Exception ex)
        {
            // something wrong. Readd this message in 1 minute
            await inputQueue.AddMessageAsync(new CloudQueueMessage(
                JsonConvert.SerializeObject(queueItem)),
                timeToLive: null,
                initialVisibilityDelay: TimeSpan.FromMinutes(1),
                options: null,
                operationContext: null
                );
        }

并防止自动读取它。有什么办法吗?

标签: queueazure-storageazure-functionsmessage-queueazure-storage-queues

解决方案


这里有几件事。

1)当有多个队列消息在等待时,队列触发器取出一批消息并发调用函数实例进行处理。默认情况下,批量大小为 16。但这可在 Host.json 中配置。如果要最小化并行执行,可以将批量大小设置为 1。Microsoft 文档对此进行了解释。

2)由于它是长时间运行的过程,因此您的消息似乎不完整,并且该功能可能会超时并且消息再次可见。您应该尝试将您的功能分解为更小的功能。然后您可以使用持久功能,它将链接您必须做的工作。


推荐阅读