提供的锁无效

问题描述

我正在使用Microsoft azure服务总线队列,每当在本地运行它时,都会出现以下2个错误

无法从文件确定项目语言。请使用[--csharp,-javascript,-typescript,-java,-python,-powershell]之一

Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁无效。锁已过期,或者消息已从队列中删除,或者已由其他接收者实例接收。

这是我的代码

public async Task Run([ServiceBusTrigger("<queue-name>",Connection = "queueConnectionString")] Message message,MessageReceiver messagereceiver,ILogger logger)
{
    var bodyJson = Encoding.UTF8.GetString(message.Body);
    var myMessage = JsonConvert.DeserializeObject<NewSubmissionMessage>(bodyJson);
    try
    {
        await _application.ProcessNewSubmission(myMessage);
        await messagereceiver.CompleteAsync(message.SystemProperties.LockToken);
    }
    catch (InvalidPackageException ex)
    {
        await messagereceiver.DeadLetterasync(message.SystemProperties.LockToken,deadLetterReason: ex.Message);
    }
}

解决方法

请检查您是否正在使用最新版本的扩展程序。如果不是4.1.1,请对其进行升级。 参考:https://github.com/Azure/azure-functions-servicebus-extension/issues/38

如果发生此类问题,建议使用服务总线资源管理器工具检查死信原因。以下文档提到与服务总线中的死字母相关的详细信息,以及导致消息死字母的各种原因: https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dead-letter-queues

例如:如果问题是送达计数,则可以将MaxDeliveryCount增大到最大值(即10)

您可以尝试显式实现重试逻辑: https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-exceptions#messagelocklostexception https://github.com/jeffhollan/functions-csharp-queue-exponential/blob/master/ExponentialRetry.cs https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#service-bus

以下是一些相关链接,您可以参考:

The lock supplied is invalid. Either the lock expired,or the message has already been removed from the queue-由于自动完成默认设置为true。将值更新为false后,即可解决。

https://github.com/MassTransit/MassTransit/issues/802#issuecomment-294879874 –从AMQP切换到NetMessaging协议后,问题已解决。

https://social.msdn.microsoft.com/Forums/azure/en-US/b86a64bb-cfcf-422b-a5fb-d831b7702c29/getting-an-exception-message-handler-encountered-an-exception?forum=servbus –使用“接收并删除”模式后,问题已解决。

但是,我们建议使用“ PeekLock”。

有关第一个错误,请参阅this

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...