#exception-handling #handler #nservicebus
#обработка исключений #обработчик #nservicebus
Вопрос:
Мы используем NServiceBus для обработки нескольких типов сообщений. На nservicebus.com они говорят, что мы не должны обрабатывать исключения, так как NServiceBus позаботится об этом. Теперь наша проблема заключается в следующем: если у нас есть два обработчика сообщений, оба обрабатывают сообщения одного и того же типа, и в одном из обработчиков есть исключение — возможно ли разрешить NServiceBus обрабатывать это исключение (повторить попытку и войти), но даже если повторные попытки завершаются неудачей, мы все равно хотим, чтобы был запущен другой обработчик? Или это означает, что мы должны обрабатывать исключение самостоятельно в обработчике номер один, чтобы быть уверенными, что обработчик номер два всегда выполняется?
Спасибо
/ Кристиан
Разъяснение:
Упрощенная версия нашего сценария: в нашей системе мы обрабатываем счета-фактуры, когда счет-фактура меняет статус, на nservicebus отправляется сообщение «InvoiceStatusChanged», и должны произойти две вещи: сообщение должно быть отправлено в очередь, а электронное письмо должно быть отправлено лицу, которое будет обрабатывать счет следующим. Эти две вещи не зависят друг от друга.
Возможно, мы допустили какую-то ошибку в нашей настройке, потому что, если обработчик, записывающий сообщение в очередь, запускается первым, а обработчик электронной почты завершает работу при каждой повторной попытке, то в итоге в очереди остается пять сообщений.
Мы перепроектируем так, чтобы событие изменения статуса отправляло на шину два разных сообщения, и каждый обработчик будет обрабатывать отдельный тип сообщения.
Спасибо
/ Кристиан
Комментарии:
1. С риском звучать как заезженная пластинка 🙂 Это запах дизайна, можете ли вы дать нам больше информации о бизнес-проблеме, которую вы пытаетесь решить?
Ответ №1:
Весь конвейер обработки сообщений находится в пределах границы транзакции. Если какой-либо из обработчиков завершается с ошибкой, то вся транзакция откатывается. Похоже, что если вы всегда хотите, чтобы запускался второй обработчик, кажется, что должно быть 2 разных сообщения и, следовательно, 2 разные транзакции, другой обработчик в другой конечной точке также разделяет их, или, может быть, вы хотите, чтобы Saga обрабатывала рабочий процесс.