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

MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue(MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除)
本文介绍了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分钟)内得到处理,则其中一些预取的消息将在它们失去锁定后开始处理、可选续订和完成。

我建议:

  1. 检查MaxLockDuration不要太短,以适应您的预取和并发。
  2. 更新prefetchCount以确保不会过度获取。
  3. 如果一条消息可以在5分钟或更短的时间内完成处理,则宁愿选择自动续费,而不是自动续费。

这篇关于MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)