本文介绍了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:提供的锁无效。锁定已过期,或消息已从队列中删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!