You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:45:03