Порядок NServicebus и обработчика сообщений

Извините, я был неясен. На самом деле между обработчиками нет никаких зависимостей, некоторые из них просто обрабатывают сообщения одного и того же типа. Например, в нашей системе мы обрабатываем счета-фактуры, очень упрощенно это происходит, когда счет-фактура поступает в систему: сообщение «InvoiceArrived» отправляется в nservicebus, и должны произойти две вещи: информация о счете-фактуре должна быть отправлена ​​во внешнюю систему и электронное письмо должно быть отправлено лицу, которое будет обрабатывать счет-фактуру (разное лицо в зависимости от информации в счете-фактуре). Эти две вещи не зависят друг от друга, но экспорт во внешнюю систему очень важен, тогда как электронная почта не так важна.

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

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

Исходное сообщение:

Мы используем NServiceBus для настройки обработчиков ряда событий, каждое из которых отправляет сообщение уникального типа на шину (в настоящее время их 6, но их число растет). Некоторые из этих событий (на данный момент 2) имеют более одного обработчика, и мы хотим, чтобы они выполнялись в определенном порядке для каждого из типов сообщений.

У нас есть собственный хост, и я знаю, что вы можете указать порядок: NServiceBus.Configure.With() ... .UnicastBus() .LoadMessageHandlers(First.Then().AndThen().AndThen() //и т. д.)

Допустим, у нас есть обработчики сообщений H1_1, H1_2 (оба обрабатывают сообщения типа 1, H1_1 должен выполняться до H1_2), соответственно H2_1, H2_2 (обработка сообщений типа 2) и H3 - H6 (единственные, которые обрабатывают сообщения типа 3 - 6)

Конечно, мы можем справиться с этим, указав все обработчики

.LoadMessageHandlers(First<H1_1>.Then<H1_1>().Then<H2_1>() //etc)

но это означает, что каждый раз, когда мы добавляем новый обработчик, мы должны добавлять в эту конфигурацию,

можно ли написать

.LoadMessageHandlers(First<H1_1>.Then<H2_1>()) //and all the other handlers are run there after?

Это, конечно, было бы лучше, но тем не менее, H1_1 и H2_1 не имеют ничего общего друг с другом и в любом случае не будут запускаться для одного и того же сообщения. Нет ли способа указать тип сообщения, то есть для типа 1 First<H1_1>.Then<H1_2>() и для типа 2 First<H2_1>.Then<H2_2>(), а для всех остальных типов спецификация не требуется, поскольку существует только один обработчик?

Заранее большое спасибо - любая помощь будет принята с благодарностью!


person Christian    schedule 19.10.2011    source источник
comment
Тот факт, что у вас так много зависимостей между вашими обработчиками, может быть признаком того, что ваш дизайн нуждается в некоторой корректировке. Можете ли вы дать нам некоторые подробности о том, что делают эти обработчики и почему важен порядок их выполнения?   -  person Andreas Öhlund    schedule 19.10.2011
comment
Также похоже, что вы можете извлечь выгоду из перемещения каждого набора типов сообщений в разные конечные точки. Это позволит вам упорядочить их по-другому, но я согласен с Андреасом, похоже, нам нужно больше деталей.   -  person Adam Fyles    schedule 20.10.2011


Ответы (1)


В версии 3.0 мы собираемся поддерживать несколько реализаций ISpecifyMessageHandlerOrdering именно по этим причинам.

person Udi Dahan    schedule 20.10.2011