MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue(MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除)
问题描述
我正在尝试使用服务总线队列触发器从队列中消费消息,并执行一些需要一些时间才能完成的工作。我不希望在处理消息时其他处理器拾取该消息。我在Host.json中有以下配置。当我从等待接收者的队列收到消息时。CompleteAsync(LockToken); 我收到一个异常&提供的锁无效。锁定已过期,或者该邮件已从队列中删除。"; "serviceBus": {
"prefetchCount": 1,
"autoRenewTimeout": "00:05:00",
"messageHandlerOptions": {
"autoComplete": false,
"maxConcurrentCalls": 1,
"maxAutoRenewDuration": "00:04:00"
}
}
Azure函数代码如下
public static void Run([ServiceBusTrigger("testqueue", Connection = "AzureServiceBus.ConnectionString")]Message message, MessageReceiver messageReceiver,ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {messageReceiver.ClientId}");
log.LogInformation($"Message={Encoding.UTF8.GetString(message.Body)}");
string lockToken = message.SystemProperties.LockToken;
log.LogInformation($"Processing Message:={Encoding.UTF8.GetString(message.Body)}");
DoSomeJob(messageReceiver, lockToken,log);
}
public static async void DoSomeJob(MessageReceiver receiver,string lockToken, ILogger log)
{
try
{
await Task.Delay(360000);
await receiver.CompleteAsync(lockToken);
}
catch (Exception ex)
{
log.LogInformation($"Error In Job={ex}");
}
}
推荐答案
当您将Azure Service Bus触发的Azure功能配置为maxAutoRenewDuration
设置为10分钟时,您正在请求触发器将锁定时间延长至10分钟。这不是保证操作,因为它是由客户端发起的,最大单次锁定时间为5分钟。在这种情况下,扩展锁的操作可能会失败,并且锁将被释放,从而导致函数的另一个实例并发处理它,而原始处理仍在进行。
prefetchCount
设置为100,maxConcurrentCalls
设置为32。这意味着您将获取多达100条消息,并处理多达32条消息。我不知道实际的函数代码是否运行超过50秒(在您的示例中),但是预取的消息锁不会自动续订。因此,如果预取的消息没有在队列的MaxLockDuration
时间(默认情况下不到5分钟)内得到处理,则其中一些预取的消息将在它们失去锁定后开始处理、可选续订和完成。
我建议:
- 检查
MaxLockDuration
不要太短,以适应您的预取和并发。 - 更新
prefetchCount
以确保不会过度获取。 - 如果一条消息可以在5分钟或更短的时间内完成处理,则宁愿选择自动续费,而不是自动续费。
这篇关于MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除


- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 输入按键事件处理程序 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01