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,也可能触发该问题。 - 检查队列是否开启会话:若队列开启了会话但触发器未配置会话支持,也会出现锁无效错误。
修复方案
- 补全host.json配置,增加锁自动续租时长,该值需设置为大于业务最长执行时间,示例如下:
"extensions": { "serviceBus": { "messageHandlerOptions": { "autoComplete": false, "maxAutoRenewDuration": "00:10:00" } } }
- 修复构造函数的字段赋值错误:
public BozaSubProcessServiceBusQueueTrigger(BozaSubProcessFactory bozaProcessFactory) { this.accountTransferProcessFactory = bozaProcessFactory; }
- 补全else分支的消息处理逻辑,避免消息无意义挂起:
else { log.LogInformation("No any Boza Sub Process Invoked"); await messageReceiver.CompleteAsync(message.SystemProperties.LockToken); }
- 若业务执行时长确实超过Service Bus队列锁最大超时(队列锁最长可设为5分钟),建议拆分长耗时逻辑为多段,搭配Durable Task编排执行,避免锁过期问题。
- 可选:升级Service Bus扩展包到5.x及以上稳定版,使用新版
Azure.Messaging.ServiceBusSDK规避已知问题,升级后对应调整消息相关类型的命名空间即可。
内容的提问来源于stack exchange,提问作者user3284094
相关产品推荐
相关产品推荐

