У меня есть длительный процесс, который я вызываю в своей очереди шины обслуживания.Я хочу, чтобы это продолжалось более 5 минут - PullRequest
0 голосов
/ 01 марта 2019

У меня есть длительный процесс, который выполняет сопоставления между миллионами записей. Я называю этот код с помощью служебной шины, однако, когда мой процесс проходит 5-минутный лимит, Azure снова начинает обрабатывать уже обработанные записи с самого начала.

Как мне избежать этого

Вот мой код:

private static async Task ProcessMessagesAsync(Message message, CancellationToken token)
 {
   long receivedMessageTrasactionId = 0;
   try
   {
     IQueueClient queueClient = new QueueClient(serviceBusConnectionString, serviceBusQueueName, ReceiveMode.PeekLock);

     // Process the message
     receivedMessageTrasactionId = Convert.ToInt64(Encoding.UTF8.GetString(message.Body));

     // My Very Long Running Method
     await DataCleanse.PerformDataCleanse(receivedMessageTrasactionId);
            //Get Transaction and Metric details

     await queueClient.CompleteAsync(message.SystemProperties.LockToken);
   }
   catch (Exception ex)
   {
     Log4NetErrorLogger(ex);
     throw ex;
   }
}

1 Ответ

0 голосов
/ 01 марта 2019

Сообщения предназначены для уведомлений и не требуют длительной обработки.

У вас есть несколько вариантов:

  1. Получить сообщение и положиться на операцию RenewLock() получателя для расширенияlock.
  2. Используйте API обратного вызова пользователя и укажите максимальное время обработки, если оно известно, с помощью параметра MessageHandlerOptions.MaxAutoRenewDuration для автоматического обновления блокировки сообщения.
  3. Запись начала обработкино не завершайте входящее сообщение.Скорее используйте функцию отсрочки сообщения , посылая себе новое отложенное сообщение со ссылкой на отложенное сообщение SequenceNumber.Это позволит вам периодически получать «напоминание» сообщения, чтобы увидеть, если работа завершена.Если это так, заполните отложенное сообщение его SequenceNumber.В противном случае заполните сообщение «напоминание» вместе с отправкой нового.Этот подход потребует некоторого уровня редизайна вашей архитектуры.
  4. Аналогично варианту 3, но перегрузка обработки на внешний процесс, который сообщит о состоянии позже.Есть рамки, которые могут помочь вам в этом.MassTransit или NServiceBus.Последний имеет сэмпл , с которым вы можете скачать и поиграть.

Обратите внимание, что опции 1 и 2 не гарантированы, так как они выполняются на стороне клиента..

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