首页 > 解决方案 > 服务总线队列触发函数锁定无效消息异常

问题描述

如果 c# Azure 队列触发器函数占用/运行超过 5 分钟(因为 azure 函数长时间运行进程),则面临以下服务总线队列触发器锁定异常。如何避免或解决此异常?如果您有一些与锁定更新和设置相关的示例,请提出建议。

提供的锁无效。锁已过期,或者消息已从队列中删除。

标签: c#azureazure-functionsazure-servicebus-queues

解决方案


首先,我们需要确保我们是最新版本,如果不是,请升级它。

确保您添加重试策略,function.json如下所示:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}

连同它一起检查死信并在MS Docs的帮助下进行配置。

我们需要在host.json中通过在JSON结构中包含参数“ maxAutoLockRenewalDuration”:“00:05:00”来提及更新的锁定持续时间

下面是 host.json 的示例

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "clientRetryOptions":{
                "mode": "exponential",
                "tryTimeout": "00:01:00",
                "delay": "00:00:00.80",
                "maxDelay": "00:01:00",
                "maxRetries": 3
            },
            "prefetchCount": 0,
            "autoCompleteMessages": true,
            "maxAutoLockRenewalDuration": "00:05:00",
            "maxConcurrentCalls": 16,
            "maxConcurrentSessions": 8,
            "maxMessages": 1000,
            "sessionIdleTimeout": "00:01:00"
        }
    }
}

从上面的 JSON 中,将参数autoCompleteMessages从 true 更改为 false 为"autoCompleteMessages": false.

当设置为 false 时,您负责调用 MessageReceiver 方法来完成、放弃或死信消息。如果抛出异常(并且没有调用任何 MessageReceiver 方法),则锁定仍然存在。一旦锁过期,消息会重新排队,DeliveryCount 递增,锁会自动更新。

使用 ReceiveandLock 解决了这种情况下的问题

参考这些SO线程:SO1SO2(感谢回答的作者详细解释)


推荐阅读