【发布时间】:2021-01-10 03:25:40
【问题描述】:
我正在使用 Azure 服务总线,并且我有以下代码 (c# .NetCore 3.1)。我经常收到错误“提供的锁无效。锁已过期,或者消息已从队列中删除,或者被不同的接收器实例接收。”当我调用“ CompleteAsync”
正如您在代码中看到的,我将“ReceiveMode.PeekLock”、“AutoComplete = false”和 MaxAutoRenewDuration 设置为 5 分钟。处理消息的代码在不到 1 秒的时间内完成,但我仍然每次都会收到该错误。
让我抓狂的是,经过数小时阅读帖子、重写代码和大量“试错”后,我决定将 MaxConcurrentCalls 从 1 增加到 2,然后错误神奇地消失了。
有人知道这里发生了什么吗?
public void OpenQueue(string queueName)
{
var messageHandlerOptions = new MessageHandlerOptions(exceptionReceivedEventArgs =>
{
Log.Error($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
return Task.CompletedTask;
});
messageHandlerOptions.MaxConcurrentCalls = 1;
messageHandlerOptions.AutoComplete = false;
messageHandlerOptions.MaxAutoRenewDuration = TimeSpan.FromSeconds(300);
messageReceiver = queueManagers.OpenReceiver(queueName, ReceiveMode.PeekLock);
messageReceiver.RegisterMessageHandler(async (message, token) =>
{
if (await ProcessMessage(message)) //really quick operation less than 1 second
{
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
else
{
await messageReceiver.AbandonAsync(message.SystemProperties.LockToken);
}
}, messageHandlerOptions);
}
【问题讨论】:
标签: c# .net-core azureservicebus