目前,我正在尝试在Web作业上实现我的服务队列总线。我对每条消息执行的过程大约需要 5 - 30 秒。虽然我在同一时间没有收到很多消息,但它运行正常,没有任何例外。否则我会收到此错误:提供的锁无效。锁定已过期,或者邮件已从队列中删除。
我正在阅读一些关于我应该用来避免此错误的时间,但它对我没有帮助(我仍然收到此错误(,我不知道为什么会发生这种情况?也许有人堆叠了类似的问题并使用我使用的其他解决方案来解决它(我将MaxAutoRenewDuration更改为5分钟(。
也许我的网络作业实施有问题?这是我的代码:
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
JobHostConfiguration config = new JobHostConfiguration();
config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Error;
queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
RegisterOnMessageHandlerAndReceiveMessages();
JobHost host = new JobHost(config);
if (config.IsDevelopment)
{
config.UseDevelopmentSettings();
}
host.RunAndBlock();
}
static void RegisterOnMessageHandlerAndReceiveMessages()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
MaxAutoRenewDuration = TimeSpan.FromMinutes(5),
AutoComplete = false
};
queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}
static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
Console.WriteLine("----------------------------------------------------");
try
{
Thread.Sleep(15000); // average time of actions that i perform
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
var results = true;
}
catch (Exception ex)
{
}
Console.WriteLine("----------------------------------------------------");
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
MessageHandlerOptions
有一个ExceptionReceivedHandler
回调,您可以使用它来获取有关失败的更多详细信息。
可能会丢失锁定,尤其是在客户端无法按时与服务器通信或出现间歇性故障 Azure 服务总线会自行重试,但需要时间的情况下。正常LockDuration
时间为 60 秒,因此您的示例代码应该可以正常工作。可能是您遇到了客户端重试的连接问题,然后锁定已过期。另一种选择是本地计算机和服务器之间的时钟偏差,这会加快锁定过期速度。您可以同步时钟以消除这种情况。
请注意,MaxAutoRenewDuration
不如LockDuration
有效。最好将LockDuration
设置为依赖于MaxAutoRenewDuration
的最大值。
如果此代码不是您用于重现问题的代码,请分享详细信息。