我正在将Azure Functions与队列触发器一起使用。
该函数运行时,它将使Azure队列中的某个项目脱离。但是,有时我的处理会失败,在这种情况下,我想重新排队该项目并在以后进行处理。
如何在Azure Functions中使用Node.js实现这一目标?
答案 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);
}
}
最后,该函数从队列中删除当前项目,但添加了具有相同内容的新项目。
这可能不是最佳解决方案,但对我来说效果很好。