Как откатить транзакцию NHibernate в NServiceBus - PullRequest
1 голос
/ 08 июня 2011

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

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

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

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

Ответы [ 3 ]

1 голос
/ 09 июня 2011

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

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

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

1 голос
/ 11 июня 2011

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

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

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

1 голос
/ 09 июня 2011

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

...