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)
功能执行完成后,该消息将被标记为完成.
中止消息的最简单方法是从函数中抛出异常,例如,当您的API响应错误状态代码时.在这种情况下,消息将被放回队列,并将重新尝试该功能(直到为此Service Bus队列配置的最大重试次数).
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |