gpt4 book ai didi

c# - 带有服务总线的Azure功能: How to keep a message in the queue if something goes wrong with its processing?

转载 作者:行者123 更新时间:2023-11-30 20:16:36 24 4
gpt4 key购买 nike

我是服务总线新手,无法弄清楚这一点。

基本上,我使用的是连接到服务总线队列的Azure函数应用程序。假设从服务总线触发了一个触发器,并且我从队列接收到一条消息,并且在处理该消息时我的代码中出现了问题。在这种情况下,我如何确保将该消息再次放回队列中?目前它刚刚消失得无影无踪,当我在 VS 上重新启动我的函数应用程序时,就会从队列中获取下一条消息。

理想情况下,只有当我所有的数据处理完成并且当我点击 myMsg.Success() 时,我才希望将其从队列中删除。

public static async Task RunAsync([ServiceBusTrigger("xx", "yy", AccessRights.Manage)]BrokeredMessage mySbMsg, TraceWriter log)
{
try{ // do something with mySbMsg }

catch{ // put that mySbMsg back in the queue so it doesn't disappear. and throw exception}
}

我正在阅读 mySbMsg.Abandon(),但看起来这会将消息放入死信队列中,我不确定如何访问它?是否有更好的错误处理方法?

最佳答案

云队列与内存队列有点不同,因为它们需要对客户端在收到队列消息后但完成处理消息之前崩溃的可能性具有鲁棒性。

当收到队列消息时,该消息将变为“不可见”,以便其他客户端无法获取它。这使客户端有机会处理它,并且客户端必须在完成后将其标记为已完成(当您从函数返回时,Azure Functions 将自动执行此操作)。这样,如果客户端在处理消息的过程中崩溃(我们在云上,因此对由于断电等导致的随机机器崩溃具有鲁棒性),服务器将看到缺少已完成的消息,假设客户端崩溃,最终重新发送消息。

实际上,这意味着如果您收到队列消息并抛出异常(因此我们不会将消息标记为已完成),它将在几分钟内不可见,但之后它将再次显示几分钟后,另一个客户端可以尝试处理它。换句话说,在 Azure 函数中,队列消息会在异常后自动重试,但在重试之间的几分钟内该消息将不可见。

关于c# - 带有服务总线的Azure功能: How to keep a message in the queue if something goes wrong with its processing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com