Как отправить ответ из обработчика nservicebus при возникновении исключения? - PullRequest
1 голос
/ 04 марта 2011

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

Вторая служба (service2) обрабатывает сообщение и обрабатывает его.В случае сбоя обработки возникает исключение, и NServiceBus пытается 5 раз обработать его (нормальное поведение), но ответ никогда не отправляется.: (

Все сервисы работают в транзакциях.

Мой вопрос: Как отправить ответ (или просто отправить другое сообщение обратно) из обработчика на service1 при возникновении исключения?

Я хочу просто уведомить сервис1, что обработка на сервисе не удалась 2.

Редактировать 1: Для более конкретной отметки service1 отмечены записи во внешней базе данных. Это необходимо для дальнейшего чтениядругие данные.

Я хочу вернуть ответ от service2 на service1, который снимает отметки с записей для тех, где было сгенерировано исключение.

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

Ответы [ 3 ]

5 голосов
/ 05 марта 2011

Вы всегда можете обернуть Bus.Reply вместо его собственного TransactionScope, например:

using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew))
{
    Bus.Reply(your message here)
    scope.Complete();
}

Это отделяет транзакцию, которую вы выполняете в результате ошибки, от транзакции, которая вызвала ошибку.

0 голосов
/ 26 сентября 2014

Так же, как улучшение Джонатана Оливера, окружите оператор using блоком finally после вашего блока try-catch, чтобы он был таким:

            finally
            {
                using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Bus.Reply<MyResponseObject>(reply);
                    scope.Complete();
                }
            }
0 голосов
/ 04 марта 2011

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

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

Может быть, вы действительно хотите синхронный запрос / ответ, и поэтому NSB может быть совсем не тем, что вам нужно.Если вы дадите нам более подробную информацию о бизнес-кейсе, мы сможем предоставить больше предложений.

...