MessageLockLostException:提供的锁无效。锁定已过期,或消息已从队列中删除 [英] MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue

查看:96
本文介绍了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:提供的锁无效。锁定已过期,或消息已从队列中删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆