Сервисная шина Azure «Предоставленная блокировка недействительна» после успешного завершения работы с сообщением - PullRequest
0 голосов
/ 30 мая 2019

У меня есть веб-задание Azure со следующим кодом инициализации

class Program
{
    static void Main(string[] args)
    {
        IHostBuilder builder = new HostBuilder()
        .ConfigureWebJobs(b =>
        {
            b.AddServiceBus((opt) =>
            {
                opt.ConnectionString = "Connection string";
                opt.MessageHandlerOptions = new MessageHandlerOptions((ex) =>
                {
                    return Task.Run(() =>
                    {
                        // logging the error message
                    });
                })
                {
                    MaxAutoRenewDuration = new TimeSpan(0, 0, 5, 0),
                    MaxConcurrentCalls = 1
                };
            });
        })
        .UseConsoleLifetime();

        IHost host = builder.Build();
        using (host)
        {
            host.Run();
        }
    }
}

Для очереди служебной шины настроена длительность блокировки 5 минут, то есть максимальное время, которое позволяет Azure.Обработка сообщений может занять более 30 минут, и механизм обновления блокировки работает правильно.Когда процесс завершается правильно, выдается исключение The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance, и сообщение снова возвращается в очередь.

1 Ответ

0 голосов
/ 30 мая 2019

Когда вы вызываете messsage.Complete() (или CompleteAsync()), вам следует создать экземпляр объекта MessageHandlerOptions, установить AutoComplete на false и передать его в регистрацию вашего обработчика сообщений.

new MessageHandlerOptions(OnException)
{
    AutoComplete = false,
    MaxConcurrentCalls = MaxConcurrentCalls, // 1
    MaxAutoRenewDuration = MaxAutoRenewDuration // 2 hrs
}

Для получения более подробной информации вы можете обратиться к этой статье .

...