如何创建使用Peek Lock模式的.NET 5.0 Azure Service Bus Queue函数
.NET 5.0 隔离进程模型下Peek Lock模式Service Bus队列函数实现
Peek Lock是Azure Service Bus的默认接收模式,无需额外在触发器特性上声明,按以下步骤配置即可:
1. 配置host.json
如果需要手动控制消息的确认、重试、死信逻辑,先在host.json中关闭自动完成消息配置:
{ "version": "2.0", "extensions": { "serviceBus": { "autoCompleteMessages": false, "maxAutoLockRenewalDuration": "00:05:00" } } }
其中maxAutoLockRenewalDuration用于配置锁自动续期的最大时长,避免长耗时处理导致消息锁提前过期。
2. 调整函数签名
需要先安装NuGet包:Microsoft.Azure.Functions.Worker.Extensions.ServiceBus 5.x以上版本。
将触发器绑定的参数从string改为ServiceBusReceivedMessage类型,同时注入ServiceBusMessageActions用于手动操作消息状态,完整示例如下:
using Azure.Messaging.ServiceBus; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; [Function("MyFunction")] public static async Task RunAsync( [ServiceBusTrigger("myfunction", Connection = "ServiceBusQueueConnection")] ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions, FunctionContext context) { var logger = context.GetLogger("MyFunction"); try { // 读取消息正文 string fileContent = message.Body.ToString(); // 业务逻辑实现 // ... // 处理成功,手动确认消息,消息会从队列删除 await messageActions.CompleteMessageAsync(message); } catch (Exception ex) { logger.LogError(ex, "消息处理失败"); // 处理失败,放弃消息,消息会重新回到队列等待下次投递 await messageActions.AbandonMessageAsync(message); // 也可根据业务需要直接将消息移入死信队列 // await messageActions.DeadLetterMessageAsync(message, deadLetterReason: ex.Message); } }
补充说明
如果你不需要手动控制消息状态,只需要靠函数执行结果自动处理,可以不用修改函数签名,保持原有string类型参数即可,默认autoCompleteMessages为true的情况下Peek Lock模式依然生效:函数执行无异常会自动完成消息,抛出未捕获异常会自动放弃消息重新投递。
内容的提问来源于stack exchange,提问作者Dave Amour
相关产品推荐
相关产品推荐

