函數(shù)式編程
2022-06-12 10:51:31
MessageLockLostExceptions我在處理消息時(shí)不斷收到。我將 Microsoft.Azure.ServiceBus 3.2.0 與 .NET Core 2.1 一起使用。我有一個(gè)LockDuration設(shè)置為 30 秒的隊(duì)列,其中已經(jīng)包含許多要處理的消息。我從https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues#receive-messages獲取了非?;镜南⒔邮战坛檀a-from-the-queue,效果很好。LockDuration現(xiàn)在我想通過添加來模擬一個(gè)運(yùn)行時(shí)間稍長的消息處理任務(wù)(但仍然在Task.Delay(10_000). 但隨后我MessageLockLostException每 4 條消息都會(huì)收到一條。即使我設(shè)置MaxAutoRenewDuration = TimeSpan.FromDays(30)and也會(huì)發(fā)生這種情況PrefetchCount = 0。這是消息處理方法,我稍作改動(dòng)以打印出剩余的鎖定持續(xù)時(shí)間: 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貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
您需要Complete
在消息Lock Token
過期之前收到消息。Lock Token 過期后,您將MessageLockLostException
在整個(gè)操作過程中收到。
我可以看到您將每條消息的線程執(zhí)行延遲 10 秒。但是這些消息似乎是在同一時(shí)間獲取的,這就是為什么每條消息的剩余鎖定持續(xù)時(shí)間不斷減少的原因。
對(duì)于第四條消息,剩余鎖定持續(xù)時(shí)間為00:00:00.1776760
。所以,在 之后177 milliseconds
,鎖就會(huì)過期。您正在下一行延遲線程10 seconds
。所以,鎖會(huì)過期,你會(huì)得到MessageLockLostException
. 為避免此異常,請(qǐng)刪除 Delay
- 2 回答
- 0 關(guān)注
- 176 瀏覽
添加回答
舉報(bào)
0/150
提交
取消