Получение исключения MessageLockLost для сообщения-посредника, даже если блокировка не истекла - PullRequest
0 голосов
/ 07 мая 2018

Я реализовал триггер служебной шины, мой пример кода, как показано ниже.

   public static async Task Run([ServiceBusTrigger("myqueue", Connection = 
    "myservicebus:cs")]BrokeredMessage myQueueItem, TraceWriter log)
    {
        try
        {   
            if (myQueueItem.LockedUntilUtc <= DateTime.UtcNow)
            {
                log.Info($"Lock expired.");

                return;
            }

            //renew lock if message lock is about to expire.             
            if ((myQueueItem.LockedUntilUtc - DateTime.UtcNow).TotalSeconds <= defaultLock)
            {
                await myQueueItem.RenewLockAsync();

                return true;
            }                

            //Process message logic        

            await myQueueItem.CompleteAsync();           
        }
        catch (MessageLockLostException ex)
        {
            log.Error($"Message Lock lost. Exception: {ex}");

        }
        catch(CustomException ex)
        {
            //forcefully dead letter if custom exception occurs
            await myQueueItem.DeadLetterAsync();
        }           
        catch (Exception ex)
        {
            log.Error($"Error occurred while processing message. Exception: {ex}");

            await myQueueItem.AbandonAsync();
        }
    }

Я установил длительность блокировки по умолчанию в очереди как 5 минут. Я получаю исключение блокировки сообщений для нескольких запросов, хотя на самом деле блокировка не просрочена. Время обработки запроса, как показано ниже:

  1. Триггер служебной шины сработал в: 07 мая 07:02:14 +00: 00 2018 utc
  2. LockedUntilUtc в посредническом сообщении: 07 мая 07: 07: 08.0149905 utc
  3. Исключение потерянной блокировки сообщения произошло в: 07 мая 07:02:18 +00: 00 2018 utc

Может кто-нибудь помочь мне выяснить, что на самом деле не так с моим кодом. Спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Вы не должны явно вызывать CompleteAsync и AbandonAsync в вашем коде.Эти методы будут вызываться средой выполнения функций Azure автоматически в зависимости от результата выполнения вашей функции (Complete, если исключение не произошло, Abandon в противном случае).

Обновление блокировки вручную также не требуется,Runtime должен управлять этим для вас.Если вы работаете в плане потребления, максимальная продолжительность выполнения функции в любом случае составляет 5 минут (по умолчанию).

Попробуйте удалить весь код подключения и оставьте только //Process message logic, посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...