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,效果很好。LockDuration现在我想通过添加来模拟一个运行时间稍长的消息处理任务(但仍然在Task.Delay(10_000). 但随后我MessageLockLostException每 4 条消息都会收到一条。即使我设置MaxAutoRenewDuration = TimeSpan.FromDays(30)and也会发生这种情况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!"); }完整代码在这里:https ://pastebin.com/sFGBgE0s
2 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
您需要Complete
在消息Lock Token
过期之前收到消息。Lock Token 过期后,您将MessageLockLostException
在整个操作过程中收到。
我可以看到您将每条消息的线程执行延迟 10 秒。但是这些消息似乎是在同一时间获取的,这就是为什么每条消息的剩余锁定持续时间不断减少的原因。
对于第四条消息,剩余锁定持续时间为00:00:00.1776760
。所以,在 之后177 milliseconds
,锁就会过期。您正在下一行延迟线程10 seconds
。所以,锁会过期,你会得到MessageLockLostException
. 为避免此异常,请删除 Delay
- 2 回答
- 0 关注
- 142 浏览
添加回答
举报
0/150
提交
取消