Azure函数队列触发器-如果失败,如何将项目放回队列?

时间:2018-08-18 11:29:11

标签: azure-functions

我正在将Azure Functions与队列触发器一起使用。

该函数运行时,它将使Azure队列中的某个项目脱离。但是,有时我的处理会失败,在这种情况下,我想重新排队该项目并在以后进行处理。

如何在Azure Functions中使用Node.js实现这一目标?

2 个答案:

答案 0 :(得分:0)

万一以后有人找答案,下面是一个使用imago-azure-storage包的代码示例:

const { Queues } = require('imago-azure-storage');
const q = new Queues(storageAccount, storageKey);

const QUEUE_NAME = 'testqueue';

(async() => {
    // Create the queue if it does not exist yet:
    await q.initializeQueues([QUEUE_NAME]);

    // Write a sample item to the queue:
    await q.put(QUEUE_NAME, { test: 12345 });

    // Retrieve up to 10 items, and if any of them fail,
    // retry processing them after 3600 seconds:
    let items = await q.fetch(QUEUE_NAME, 10, 3600);
    for (const { item, message } of items) {
        try {
          console.log(item);
          await doSomeWork(item); // <-- your function here

          // Items processed successfully, delete it from queue:
          await q.commit(message);
        } catch (error) {
          // Ignore errors, the item will be requeued automatically
          // in 3600 seconds.
        }
    }
})();

答案 1 :(得分:0)

我所做的解决方法是创建一个绑定到触发该函数的相同队列。

 [FunctionName("FunctionsQueueTrigger")]
    public static async Task Run(
        [QueueTrigger("101functionsqueue")] string myQueueItem,
        [Queue("101functionsqueue")]  IAsyncCollector<string> myQueue)

就我而言,如果代码412(先决条件失败)引发了存储异常,我想将项目放回队列。

catch (StorageException ex)
        {
            if (ex.RequestInformation.HttpStatusCode == (int)System.Net.HttpStatusCode.PreconditionFailed) //412
            {
                log.LogWarning($"Putting item back to queue due to {ex.Message} error.");
                await myQueue.AddAsync(myQueueItem);
            }
        }

最后,该函数从队列中删除当前项目,但添加了具有相同内容的新项目。

这可能不是最佳解决方案,但对我来说效果很好。