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

Azure Function V3 .NET Core使用Service Bus出现锁无效错误如何解决

问题排查与解决方案

错误本质

你遇到的The lock supplied is invalid错误本质是当前操作消息时,所持有的消息锁已经失效,常见触发场景为锁超时过期、消息已被其他处理实例完成/移除、锁关联的接收者实例已销毁。

分步排查点

  • 检查Service Bus队列的锁默认超时时间:默认队列锁超时为30秒,若你的ExecuteAsync业务逻辑执行时间超过该时长,锁会被服务端自动释放,后续调用CompleteAsync/DeadLetterAsync就会报错。
  • 检查host.json配置缺失:你仅关闭了自动完成,未配置锁自动续租时长maxAutoRenewDuration,运行时不会自动延长锁有效期,长耗时业务必然触发锁过期。
  • 检查代码分支漏处理:无匹配服务的else分支中,你既未完成消息也未将消息移入死信队列,消息锁到期后会被服务端自动回收重新投递,重复投递后原处理实例持有的锁自然失效。
  • 检查代码拼写错误:构造函数中字段赋值逻辑错误,你声明的私有字段为accountTransferProcessFactory,但构造函数中赋值给了不存在的BozaProcessFactory,会触发空引用异常,导致逻辑进入异常分支引发不必要的重试。
  • 检查SDK版本问题:你使用的Microsoft.Azure.WebJobs.Extensions.ServiceBus 4.3.0属于旧版Track 0 SDK,存在部分已知的锁续租bug,也可能触发该问题。
  • 检查队列是否开启会话:若队列开启了会话但触发器未配置会话支持,也会出现锁无效错误。

修复方案

  1. 补全host.json配置,增加锁自动续租时长,该值需设置为大于业务最长执行时间,示例如下:
"extensions": {
  "serviceBus": {
    "messageHandlerOptions": {
      "autoComplete": false,
      "maxAutoRenewDuration": "00:10:00"
    }
  }
}
  1. 修复构造函数的字段赋值错误:
public BozaSubProcessServiceBusQueueTrigger(BozaSubProcessFactory bozaProcessFactory)
{
    this.accountTransferProcessFactory = bozaProcessFactory;
}
  1. 补全else分支的消息处理逻辑,避免消息无意义挂起:
else
{
    log.LogInformation("No any Boza Sub Process Invoked");
    await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
  1. 若业务执行时长确实超过Service Bus队列锁最大超时(队列锁最长可设为5分钟),建议拆分长耗时逻辑为多段,搭配Durable Task编排执行,避免锁过期问题。
  2. 可选:升级Service Bus扩展包到5.x及以上稳定版,使用新版Azure.Messaging.ServiceBus SDK规避已知问题,升级后对应调整消息相关类型的命名空间即可。

内容的提问来源于stack exchange,提问作者user3284094

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:36:04