使用Servicebus的Azure功能如何不将消息标记为完整

w2o*_*ves 1 c# azure azureservicebus azure-functions

我有一个Azure函数,用于侦听Azure Servicebus队列中的消息.当它收到消息时,它将它们标记为已完成,并且它们不再在队列中.有没有办法只在长过程完成时将它们标记为?如果失败,还是将它们标记为完整?

我的函数调用Api,我希望消息不被标记为完成,直到Api用成功代码回复.

Dam*_*ene 13

当它收到消息时,它会将它们标记为完成,并且它们不再在队列中。

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

为了更好地控制您的消息何时完成、放弃等,您可以将您的消息作为之前提到的BrokeredMessage类型使用。此类直接支持控制消息发生情况所需的方法。请注意,服务总线触发器文档中提到BrokeredMessage应该用于 Azure Functions 版本1.*。如果您使用的是2.*版本,则应将您的消息作为Message类型使用。

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

为了展示这是如何工作的,这里有一个使用Messagewith的死字示例MessageReceiver

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

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

    . . .
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": false
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*kov 7

功能执行完成后,该消息将被标记为完成.

中止消息的最简单方法是从函数中抛出异常,例如,当您的API响应错误状态代码时.在这种情况下,消息将被放回队列,并将重新尝试该功能(直到为此Service Bus队列配置的最大重试次数).