Ред на NServicebus и Message Handler

Съжалявам, че не бях ясен. Всъщност няма никакви зависимости между манипулаторите, някои от тях просто обработват един и същи тип съобщение. Например в нашата система ние обработваме фактури, много опростено това се случва, когато фактура пристигне в системата: съобщение „InvoiceArrived“ се изпраща до nservicebus и трябва да се случат две неща, информацията за фактурата трябва да бъде изпратена до външна система и имейлът трябва да бъде изпратен до лицето, което трябва да обработва фактурата (различно лице в зависимост от информацията във фактурата). Тези две неща не зависят едно от друго, но експортирането към външната система е много важно, докато имейлът не е толкова важен.

Това, което се случи, беше, че манипулаторът, изпращащ имейл, беше стартиран първи и се срина (поради лоша конфигурация), беше повторен опит пет пъти, но се срина всеки път и не се осъществи нито имейл, нито експортиране към външна система. Коригирането на конфигурацията беше лесно, но ни показа недостатък в нашия дизайн.

Сега разбирам, че трябва да преосмислим дизайна, защото указването на реда, в който се изпълняват манипулаторите, няма да реши нищо, тъй като обратната ситуация също не е желателна, че първо се изпълнява манипулаторът за експортиране и след това се срива манипулаторът за изпращане по имейл, което води до пет повторни опити и пет успешни експортирания (но без успешен имейл). Предполагам, че ще трябва да изпратим един тип съобщение за всеки манипулатор...

Оригинално съобщение:

Използваме NServiceBus, за да настроим манипулатори за редица събития, всяко от които изпраща уникален тип съобщение към шината (в момента 6, но броят им нараства). Някои от тези събития (2 в момента) имат повече от един манипулатор и искаме те да се изпълняват в определен ред за всеки от типовете съобщения.

Имаме собствен хост и знам, че можете да посочите реда като: NServiceBus.Configure.With() ... .UnicastBus() .LoadMessageHandlers(First.Then().AndThen().AndThen() //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>() и за всички останали типове не е необходима спецификация, тъй като има само един манипулатор?

Благодаря ви много предварително - всяка помощ ще бъде високо оценена!


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