#handler #message #nservicebus
#обработчик #Сообщение #nservicebus
Вопрос:
Извините, я был неясен. На самом деле между обработчиками нет никаких зависимостей, некоторые из них просто обрабатывают сообщения одного и того же типа. Например, в нашей системе мы обрабатываем счета-фактуры, очень упрощенно это происходит, когда счет-фактура поступает в систему: на nservicebus отправляется сообщение «InvoiceArrived», и должны произойти две вещи: информация о счете-фактуре должна быть отправлена во внешнюю систему, и электронное письмо должно быть отправлено лицу, которое должнообработка счета-фактуры (разные лица в зависимости от информации в счете-фактуре). Эти две вещи не зависят друг от друга, но экспорт во внешнюю систему очень важен, тогда как электронная почта не так важна.
Произошло то, что обработчик, отправляющий электронное письмо, был запущен первым, и он был взломан (из-за плохой конфигурации), он повторялся пять раз, но каждый раз проверялся, и ни электронная почта, ни экспорт во внешнюю систему не выполнялись. Исправить конфигурацию было легко, но это показало нам недостаток в нашем дизайне.
Теперь я понимаю, что нам нужно переосмыслить дизайн, потому что указание порядка, в котором запускаются обработчики, ничего не решит, поскольку противоположная ситуация также нежелательна: сначала запускается обработчик экспорта, а затем завершается в обработчике электронной почты, что приводит к пяти повторным попыткам и пяти успешным экспортам (но без успешного отправки электронной почты). Я думаю, нам придется отправлять один тип сообщения для каждого обработчика…
Исходное сообщение:
Мы используем NServiceBus для настройки обработчиков для ряда событий, каждое из которых отправляет на шину уникальный тип сообщения (в настоящее время 6, но их число растет). Некоторые из этих событий (2 на данный момент) имеют более одного обработчика, и мы хотим, чтобы они выполнялись в определенном порядке для каждого из типов сообщений.
У нас есть собственный хост, и я знаю, что вы можете указать порядок как: NServiceBus.Настройте.С помощью () … .UnicastBus() .LoadMessageHandlers(сначала.Затем().И затем().И затем() //etc)
Допустим, у нас есть обработчики сообщений 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>()
, а для всех других типов спецификация не требуется, поскольку существует только один обработчик?
Заранее большое вам спасибо — любая помощь будет принята с благодарностью!
Комментарии:
1. Тот факт, что у вас так много зависимостей между вашими обработчиками, может быть признаком того, что ваш дизайн нуждается в некоторой корректировке. Можете ли вы дать нам некоторые подробности о том, что делают эти обработчики и почему порядок, в котором они выполняются, имеет значение?
2. Также похоже, что вы можете извлечь выгоду из перемещения каждого набора типов сообщений в разные конечные точки. Это позволило бы вам упорядочивать их по-разному, но я согласен с Андреасом, похоже, нам нужно больше деталей.
Ответ №1:
В версии 3.0 мы собираемся поддерживать несколько реализаций ISpecifyMessageHandlerOrdering именно по этим причинам.