#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);