NServiceBus, как вы выполняете действие перед отправкой сообщения в очередь ошибок? - PullRequest
0 голосов
/ 02 июля 2018

Я использую NService для создания конечной точки.

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

Я знаю, что NServiceBus поддерживает ImmediateRetry и DelayRetry, и они настраиваются.

Теперь я хочу опубликовать событие результата сбоя на других конечных точках после всех повторных попыток (перед отправкой в ​​очередь ошибок).

public async Task Handle(MyEvent message, IMessageHandlerContext context)
        {
            Console.WriteLine($"Received MyEvent, ID = {message.Id}");

            //Connect to other services to get data and do some calculation
            Thread.Sleep(1000);            


            Console.WriteLine($"Processed MyEvent, ID = { message.Id}");


            await context.Publish(new MyEventResult { IsSucceed = true });
        }

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

Заранее спасибо.

Примечания: я использую NServiceBus 6.4.3

1 Ответ

0 голосов
/ 03 июля 2018

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

См. Следующий пример саги:

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

Используя sagas, вы делаете свой процесс явным. Я бы не стал использовать механизм восстановления для этого.

Механизм восстановления предназначен для устранения временных ошибок, таких как проблемы с сетевым подключением, взаимные блокировки баз данных и т. Д., Но не с ожидаемыми результатами сбоя. Вы должны правильно обработать их и продолжить смоделированный процесс по его несчастному пути.

...