Как запретить NServiceBus не отправлять сообщения об ошибках - PullRequest
0 голосов
/ 05 апреля 2019

Я новичок в NServiceBus, так что, может быть, я спрашиваю здесь кое-что довольно глупое, но есть ли способ заставить NServiceBus не прекращать отправку сообщений, отправляемых в ответ на сообщение, обработчик которого не работает?

Позвольте мне объяснить на простом примере.

Предположим, у меня есть OrderPaidEvent, у которого есть обработчик, который выполняет следующее:

  1. Ищите клиента
  2. Запустите транзакцию БД
  3. Обновите клиента до хорошего клиента
  4. Отправьте CustomerUpgradedToGoodCustomerEvent сообщение
  5. Передайте транзакцию БД

Справедливовсе просто в мире.Теперь, спустя несколько месяцев, кто-то еще полагает, что электронное письмо было бы хорошо, когда заказ оплачен, и, таким образом, добавляет к обработчику OrderPaidEvent еще один обработчик для отправки электронного письма.

К сожалению, теперь, когда у почтового сервера возникает проблема,этот второй обработчик завершится с ошибкой, которая, однако, предотвратит отправку исходного сообщения CustomerUpgradedToGoodCustomerEvent (шаг 4).Но поскольку транзакция БД уже была зафиксирована (шаг 5), клиент уже был преобразован в хорошего клиента в базе данных.

Это означает, что даже если обработчик OrderPaidEvent будет повторен, клиент больше не изменяется итаким образом сообщение CustomerUpgradedToGoodCustomerEvent никогда не отправляется.Что еще хуже, это все из-за изменения в коде, которое не имеет ничего общего с исходным обработчиком сообщений и, следовательно, его будет трудно обнаружить.

Это кажется огромным недостатком, и так как я новичок вЯ уверен, что я что-то не так делаю, но я не могу понять, что это такое.

Любая помощь от вас, прекрасные люди, была бы великолепна.

Спасибо завперед.

1 Ответ

2 голосов
/ 05 апреля 2019

Как насчет разбиения вашего процедурного кода на отдельные обработчики?После этого каждая логическая операция будет выполняться или не будет выполняться на основе успешного завершения каждой гранулированной задачи.

Если вы добавите Saga в смесь, то вы сможете принимать бизнес-решения на основезавершенные шаги в вашей саге.

Также, возможно, читайте больше о транзакциях и NServiceBus здесь

...