编程语言
首页 > 编程语言> > c#-Azure服务总线不断抛出MessageLockLostExceptions

c#-Azure服务总线不断抛出MessageLockLostExceptions

作者:互联网

处理消息时,我一直收到MessageLockLostExceptions.

>我正在将Microsoft.Azure.ServiceBus 3.2.0与.NET Core 2.1一起使用.
>我有一个设置为30秒的LockDuration队列,其中已经包含许多要处理的消息.
>我从https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues#receive-messages-from-the-queue那里获得了非常基本的消息接收教程代码,效果很好.

现在,我想通过添加Task.Delay(10_000)模拟稍长一些的消息处理任务(但在LockDuration中仍然很好).但是随后我恰好每第4条消息都得到一个MessageLockLostException.

即使我将MaxAutoRenewDuration = TimeSpan.FromDays(30)设置为PrefetchCount = 0,也会发生这种情况.

这是消息处理方法,我稍作更改以打印出剩余的锁定时间:

    private static async Task processMessagesAsync(Message message, CancellationToken token)
    {
        Console.Write($"Received message: {message.SystemProperties.SequenceNumber}. Remaining lock duration: {message.SystemProperties.LockedUntilUtc - DateTime.UtcNow}");
        await Task.Delay(10000);
        await queueClient.CompleteAsync(message.SystemProperties.LockToken);
        Console.WriteLine(" - Complete!");
    }

样本输出:

======================================================
Press ENTER key to exit after receiving all the messages.
======================================================
Received message: 3659174697238584. Remaining lock duration: 00:00:30.8269132 - Complete!
Received message: 19421773393035331. Remaining lock duration: 00:00:20.5271654 - Complete!
Received message: 11540474045136941. Remaining lock duration: 00:00:10.3372697 - Complete!
Received message: 15762598695796784. Remaining lock duration: 00:00:00.1776760
Message handler encountered an exception     Microsoft.Azure.ServiceBus.MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue. Reference:2c6caac3-e607-4130-a522-f75e4636e130, TrackingId:3ff82738-664d-4aca-b55f-ba3900f1c640_B17, SystemTracker:ocgtesting:queue:workflow~63, Timestamp:2018-12-12T17:01:59
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.OnRenewLockAsync(String lockToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 1260
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.<>c__DisplayClass74_0.<<RenewLockAsync>b__0>d.MoveNext() in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 771
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1 operation, TimeSpan operationTimeout) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:line 83
at Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1 operation, TimeSpan operationTimeout) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:line 105
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.RenewLockAsync(String lockToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 773
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.RenewLockAsync(Message message) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 742
at Microsoft.Azure.ServiceBus.MessageReceivePump.RenewMessageLockTask(Message message, CancellationToken renewLockCancellationToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\MessageReceivePump.cs:line 248.

此处的完整代码:https://pastebin.com/sFGBgE0s

解决方法:

再现中缺少的一件事是队列描述.重要的是要注意这些细节,因为您遇到的问题与客户端无关,并且很可能与代理或基础AMQP库有关.

对于非分区队列,此设置可以正常工作.它不适用于分区队列(标准层).新老客户均可观察到.我已经为Azure Service Bus团队筹集了与经纪人相关的issue,以进行调查.

标签:azureservicebus,azure-servicebus-queues,c
来源: https://codeday.me/bug/20191108/2007431.html