Azure 服务总线作为 Web 作业引发错误 提供的锁无效



目前,我正在尝试在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的最大值。

如果此代码不是您用于重现问题的代码,请分享详细信息。

最新更新