【发布时间】:2018-12-12 17:11:09
【问题描述】:
我在处理消息时不断收到MessageLockLostExceptions。
- 我正在使用 Microsoft.Azure.ServiceBus 3.2.0 和 .NET Core 2.1。
- 我有一个队列,其中
LockDuration设置为 30 秒,已经包含许多要处理的消息。 - 我从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
【问题讨论】:
-
您如何收到您的消息?你能分享一个完整的repro吗?您收到剩余锁定持续时间少于
MaxLockDuration的消息这一事实清楚地表明某些事情已经关闭。 -
@SeanFeldman 是的,这里:pastebin.com/sFGBgE0s
-
pastebin中的代码使用了Thread.Sleep而不是TaskDelay,并且PrefetchCount=0已经被注释掉了,但是没有什么区别。
-
您使用的是什么版本的 ASB 客户端?
-
我怀疑这是一个错误。看我的回答below。
标签: c# azureservicebus azure-servicebus-queues