Azure Service Bus作为Web作业抛出错误提供的锁无效

时间:2018-02-03 22:23:20

标签: c# azure azureservicebus

目前我要在网络工作上实施我的服务队列总线。我对每封邮件执行的过程大约需要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);
    }

1 个答案:

答案 0 :(得分:0)

MessageHandlerOptionsExceptionReceivedHandler callback您可以用来获取有关失败的更多详细信息。

可能会发生丢失锁定,尤其是如果客户端无法按时与服务器进行通信,或者Azure Service Bus会自行重试,但需要时间。正常LockDuration时间为60秒,因此您的示例代码应该有效。可能是您遇到了客户端重试的连接问题,然后锁定已过期。另一个选项是本地计算机和服务器之间的时钟偏差,这会加速锁定到期。您可以同步时钟以消除它。

请注意,MaxAutoRenewDuration不如LockDuration有效。最好将LockDuration设置为依赖MaxAutoRenewDuration的最大值。

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