当前位置: 首页 > 知识库问答 >
问题:

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

邹野
2023-03-14

我正在使用带有队列触发器的Azure Functions。

当函数运行时,它会从Azure队列中删除一个项目。然而,有时我的处理会失败,在这种情况下,我想重新申请该项目,并在以后进行处理。

如何在Azure函数和使用Node中实现这一点。js?

共有2个答案

郜俊健
2023-03-14

如果有人稍后正在寻找答案,这里有一个使用imago-azure存储包的代码示例:

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.
        }
    }
})();
赫连坚
2023-03-14

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

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

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

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

 类似资料:
  • 我使用VisualStudio代码创建了一个Azure Service Bus Queue Trigger Python函数,如果代码失败,我希望将消息返回到Service Bus队列。 我找到了一些关于一个名为unlock()和discard()的方法的信息,但我不知道如何实现它。以下是这些文档的链接: 解锁:https://docs.microsoft.com/en-us/azure/serv

  • 本文向大家介绍azure-webjobs 队列触发器,包括了azure-webjobs 队列触发器的使用技巧和注意事项,需要的朋友参考一下 示例 一个简单的示例,定义一个由队列消息触发的功能: 它还支持POCO序列化:            

  • 我正在Azure中创建一个函数应用程序,并希望使用队列触发器。我知道如何在设计时配置队列名称,例如: 但是,我希望能够在配置文件中定义和引用它。我知道函数的存在。json(可能是这个),主机。json和本地。设置。json,但我不知道如何在其中设置队列名称并在函数中引用它。 如果我部署在VisualStudio中新创建的函数(使用新的15.3更新),我可以在函数中看到以下内容。部署后的json文件

  • 我们试图在我们的Spring Boot应用程序中使用sping-Rabbit创建一个消息侦听器。但是,如果队列不存在,我们在接收消息期间会遇到问题,应用程序会抛出错误,称为被动声明。 我们想要的是主动声明队列,即如果队列不存在,则应该在mq中声明它。

  • 我有一个Java项目,它使用了一些Azure函数,如HttpTrigger和QueueTrigger。我使用原型来生成这个项目,因此它可以使用HttpTrigger的一些样板代码和它的单元测试,但对QueueTrigger没有任何帮助。我正试图得到帮助,为这个QueueTrigger编写一个好的单元测试,它实际上是从队列中读取消息(弹出)。队列的代码如下所示: 有没有人能推荐一下这个队列触发azu

  • 在.NET core 2.0中使用创建时,我遇到了一个问题。 在体系结构中,当在用于创建用户的队列中创建新消息时,服务必须接收该消息并根据其中的信息在数据库中创建用户。 在Visual Studio2017中,我在下创建了一个新项目。 这种的正确实现是什么?在GitHub上有什么例子吗?提前道谢。