如何通过代码设置Azure服务总线主题订阅的Lock Duration参数
解决方案
1. 正确配置LockDuration
LockDuration是服务总线订阅的服务端属性,不属于Azure Functions的运行时配置,所以你在host.json中配置MaxLockDuration不会生效,需要在创建订阅时通过SubscriptionDescription指定:
public async Task CreateSubscription(string connectionString, string topicName, string subsciptionName) { var m = new ManagementClient(connectionString); var exists = await m.SubscriptionExistsAsync(topicName, subsciptionName); if (!exists) { await m.CreateSubscriptionAsync(new SubscriptionDescription(topicName, subsciptionName) { // 此处设置LockDuration,服务端最大支持5分钟 LockDuration = TimeSpan.FromMinutes(5) }); } }
注意:如果对应订阅已经提前创建完成,修改上述代码不会生效,需要手动到Azure门户修改现有订阅的
LockDuration属性,或删除旧订阅让代码重新创建。
2. 修正host.json配置
你当前的host.json配置层级和参数命名错误,导致autoRenewTimeout等参数不生效,正确配置如下(适配Azure Functions进程内模型):
{ "version": "2.0", "extensions": { "serviceBus": { "maxConcurrentCalls": 1, "messageHandlerOptions": { "autoComplete": true, "autoRenewTimeout": "00:30:00" } } } }
两个核心参数的作用区别:
LockDuration:服务端单次消息锁的有效时长,最长只能设5分钟,到期后未处理的消息会自动释放回队列autoRenewTimeout:函数运行时的本地配置,若函数处理消息的时长超过LockDuration,运行时会自动续租消息锁,最长续租到该配置的时长,需保证该值大于你业务逻辑的最长执行时间
3. 额外注意事项
如果你的函数运行时间超过autoRenewTimeout的时长,仍会出现锁自动释放的问题,需要对应调整该配置的大小。
内容的提问来源于stack exchange,提问作者user1367995
相关产品推荐
相关产品推荐

