c# - Azure功能与Servicebus如何不将消息标记为完成

标签 c# azure azure-functions azureservicebus

我有一个 Azure 函数,用于监听 Azure Servicebus 队列中的消息。当它收到消息时,它将它们标记为完成并且它们不再位于队列中。 有没有办法将它们标记为仅当一个长过程完成时?或者如果失败则取消将它们标记为完整?

我的函数调用 Api,我希望在 Api 返回成功代码之前不要将消息标记为完成。

最佳答案

When it receives the messages it marks them as complete and they are no longer in the queue.

默认情况下,Functions 运行时实际上不会将消息标记为完整 until your function returns successfully 。正如已接受的答案中所提到的,抛出异常(在您的情况下,如果被调用的 API 返回不利的响应)将放弃该消息并阻止其被标记为完成。

为了更好地控制消息何时完成、放弃等,您可以将消息用作 BrokeredMessage类型如前所述。此类直接支持您控制消息发生的情况所需的方法。请注意,service bus trigger documentation提到 BrokeredMessage 应该用于 Azure Functions 版本 1.*。如果您使用的是 2.* 版本,则应将消息用作 Message改为键入。

使用 Message 的一个痛点是,与 BrokeredMessage 不同,它没有直接让您控制消息何时完成等的方法。为了达到这个目的,我们可以绑定(bind)一个MessageReceiver我们函数的参数。

为了展示其工作原理,这里有一个使用 MessageMessageReceiver 的死信示例:

[FunctionName("SOExampleFunction"]
public static async Task ProcessMessage(
    [ServiceBusTrigger("myqueue")] Message message,
    MessageReceiver messageReceiver)
{
    . . .

    await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);

    . . .
}

使用此方法时,请确保在 host.json 中将“autoComplete”服务总线设置设置为 false。例如:

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": false
      }
    }
  }
}

关于c# - Azure功能与Servicebus如何不将消息标记为完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44009647/

相关文章:

c# - WCF - 返回带有流数据的对象

c# - 从 Function App ILogger (C#) 在 Application Insights 中记录自定义对象

c# - 如何从Azure Function更新服务总线消息?

python - 时间触发的 Azure 函数不会每分钟触发一次

c# - MVC 4 中正确的 JSON 序列化

c# - 访问本地 IIS : "This operation is not supported for a relative URI." 上托管的 WCF 服务时出错

c# - m safeCertContext 是无效句柄

azure - azure-pipelines 中的 apt-get 安装随机失败

c# - 使用不同的引用和框架编译.NET项目

将库部署到 Databricks DBFS 403 禁止错误的 Azure DevOps CD 管道