c# - 服务总线队列触发函数锁定无效消息异常
问题描述
如果 c# Azure 队列触发器函数占用/运行超过 5 分钟(因为 azure 函数长时间运行进程),则面临以下服务总线队列触发器锁定异常。如何避免或解决此异常?如果您有一些与锁定更新和设置相关的示例,请提出建议。
提供的锁无效。锁已过期,或者消息已从队列中删除。
解决方案
首先,我们需要确保我们是最新版本,如果不是,请升级它。
确保您添加重试策略,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 解决了这种情况下的问题
推荐阅读
- git - GitLab 合并请求附加文件
- django - 在 Django 的 installed_apps 中包含“频道”时出错
- wordpress - Woocommerce - 无法在多站点上注销
- html - 为什么每次我换行时都会腾出一个空间?
- r - 无法使用 R 从日期中提取日期和月份
- algorithm - 如何设计一个支持插入、删除(键、值)对以及在 O(1) 时间内获取最小值和最大值的数据结构?
- javascript - express async/await returning undefined
- python - 无法在 VSC 中保存 Jupyter Notebook
- r - 如何使用 ggplot2 括住 X 轴标签?
- groovy - 如何使用 Script runner groovy 脚本获取数组项