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

标签 c# azure azure-functions azureservicebus azure-servicebus-queues

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

基本上,我使用的是连接到服务总线队列的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/

相关文章:

c# - 从 C# 创建 accdb 文件

c# - ElementHost 大小导致 wpf 打开/加载速度慢且内存使用率高

c# - 如何保护基场的公共(public)/私有(private)

Azure Functions Core Tools 使用默认函数 : can't find . ./azurefunctions/functions.js 引发错误

c# - 在 C# 中将泛型对象添加到泛型列表

Azure Runbook 在测试 Pane 中运行,而不是按计划运行

azure - ADF - 如何比较具有相同结构的两个 Azure SQL 数据库表(A 和 B)并仅将缺失值从表 A 插入到表 B

azure - Sitecore 8.1 Lucene 未更新 - 如何确定索引是否已完全构建?

Azure Functions 筛选器功能正式发布

azure - 从守护程序应用程序访问受 oAuth2 保护的 Azure Function