Я не могу повторить неудачную попытку элемента в теме служебной шины Azure

#c# #.net #azureservicebus #azure-servicebus-queues #azure-servicebus-topics

#c# #.net #автобус azureservicebus #azure-служебный автобус-очереди #azure-служебный автобус-темы

Вопрос:

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

Вот мой обработчик сообщений;

 public async Task StartRecieverAsync()  {  var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)  {  MaxConcurrentCalls = 1,  AutoComplete = false,  MaxAutoRenewDuration = TimeSpan.FromSeconds(30)  };   _creatorSubscription.RegisterMessageHandler(ProcessCreatorMessageAsync, messageHandlerOptions);   Console.ReadLine();   await _creatorSubscription.CloseAsync();  }   private async Task ProcessCreatorMessageAsync(Message message, CancellationToken token)  {  try  {  var jsonString = Encoding.UTF8.GetString(message.Body);  PickingRequest req = JsonSerializer.Deserializelt;PickingRequestgt;(jsonString);   WorkOrderManager manager = new WorkOrderManager(_sqlManager, _cacheManager, _workOrderFunctions);  manager.CreatePickingTask(req);   SendNotification(req.UserRegistrationNumber, NotificationConstants.PickingRequestNotification);   await _creatorSubscription.CompleteAsync(message.SystemProperties.LockToken);  }  catch  {  if (message.SystemProperties.DeliveryCount lt; 5)  {  await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);  }  else  {  await _creatorSubscription.DeadLetterAsync(message.SystemProperties.LockToken);  }  }  }  

Сначала 5 раз я хотел бы повторить попытку, но результаты не меняются, я хочу отправить элемент в очередь мертвых писем. Но после первого раза элемент попадает в очередь мертвых писем.

Ответ №1:

Как настроена подписка на темы на служебной шине? Если максимальное количество доставок равно 1, то после первого сбоя служебная шина переместит сообщение в очередь с мертвыми буквами. Свойства подписки на раздел Служебная шина:

введите описание изображения здесь

  • Кроме того , как правило, нет необходимости вручную отправлять сообщение с мертвой буквой с вызовами DeadLetterAsync , служебная шина сделает это, как только будет превышено максимальное количество доставок. т. Е. ваш блок catch может быть упрощен до просто await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);