Заказ NServicebus и обработчика сообщений - PullRequest
1 голос
/ 19 октября 2011

Извините, мне было неясно. На самом деле между обработчиками нет никаких зависимостей, некоторые из них просто обрабатывают один и тот же тип сообщения. Например, в нашей системе мы обрабатываем счета-фактуры, очень упрощенно это происходит, когда счет поступает в систему: сообщение «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>() и для всех других типов, указание не требуется, поскольку имеется только один обработчик?

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

1 Ответ

1 голос
/ 20 октября 2011

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

...