Как откатить транзакцию NHibernate в NServiceBus

Насколько я понимаю, при использовании NServiceBus у нас есть два типа исключений.

Окружающая среда: это означает, что любой требуемый компонент в настоящее время недоступен. Обычно приводит к полному откату транзакции. Это описание, которое я вижу за откатом в документации NServiceBus (включая возвращение сообщения на шину - что звучит фантастически). Как мне это сделать?

Проверка: обрабатывается сообщение, которое не может быть успешным из-за бизнес-логики, правил и т. Д. Где я хочу откатить все взаимодействия с базой данных, но нет смысла держать команду в очереди. В этом случае я просто хочу откатить часть транзакции NHibernate, а не часть MSMQ. Как мне это сделать? Обычно я выполняю проверку до того, как будет обработано какое-либо отдельное сообщение, но когда у вас есть несколько сообщений, связанных вместе в одну транзакцию, и вы хотите откатить их все обратно, это невозможно с помощью предварительной проверки.

Мое предположение состоит в том, что либо ответ безумно очевиден, и я его упустил, либо то, что я пытаюсь сделать, невозможно (в отношении исключения Validation).


person Tony Ashworth    schedule 08.06.2011    source источник


Ответы (3)


NSB заботится о том, чтобы сообщение не мешало, перемещая его в очередь ошибок (v2.5). В версии 3 эта функциональность расширена и даст вам больше возможностей для обработки ошибок (DB, пользовательские и т. Д.). Очередь ошибок настраивается в вашем app.config.

person Adam Fyles    schedule 09.06.2011

По моему опыту, проще всего (и, вероятно, также более уместно) гарантировать, что сообщения имеют очень высокую вероятность успеха, когда они участвуют в распределенной транзакции.

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

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

person mookid8000    schedule 09.06.2011

Спасибо за ваши ответы. Я считаю, что ответ лежит где-то посередине.

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

К сожалению, пока мы не дойдем до версии 3, мы в настоящее время не можем использовать очередь ошибок, поскольку мы используем функцию ответа на сообщения, чтобы предупреждать интеграторов о проблемах с их сообщениями. А выдача необработанной ошибки предотвращает создание каких-либо ответов.

person Tony Ashworth    schedule 10.06.2011