nservicebus - Nservice bus saga ordering -
i have 2 saga's namely client saga , client billing saga.
public class clientsagastate:icontainsagadata { #region nservicebus public guid id { get; set; } public string originator { get; set; } public string originalmessageid { get; set; } #endregion public guid clientref { get; set; } public clientmessage clientchangemessage { get; set; } public clientcontactchangemessage clientcontactchange { get; set; } } public class clientbillingsagastate:icontainsagadata { #region nservicebus public guid id { get; set; } public string originator { get; set; } public string originalmessageid { get; set; } #endregion public guid clientref { get; set; } public guid funderref { get; set; } public guid clientbillingref { get; set; } public clientbillingmessage clientbillingmessage { get; set; } } public class clientsaga:saga<clientsagastate>, iamstartedbymessages<clientchangemessage>, iamstartedbymessages<clientcontactchangemessage> { public override void configurehowtofindsaga() { configuremapping<clientchangemessage>(s => s.clientref, m => m.entityref); configuremapping<clientcontactchangemessage>(s => s.clientref, m => m.primaryentityref); } public void handle(serviceuserchangemessage message) { if (busreftranslator.getlocalref(entitytranslationnames.clientchange, message.entityref.value) != null) { gethandler<clientchangemessage>().handle(message); completethesaga(); return; } handleserviceuserchangeanddependencies(message); //markascomplete(); completethesaga(); } } public class clientbillingsaga:saga<clientbillingsagastate> ,ihandlemessages<clientchangemessage>, iamstartedbymessages<clientbillingmessage>, ihandlemessages<funderchangemessage> { public override void configurehowtofindsaga() { configuremapping<clientchangemessage>(s => s.clientref, m => m.entityref); configuremapping<funderchangemessage>(s => s.funderref, m => m.entityref); configuremapping<clientbillingmessage>(s => s.clientbillingref, m => m.primaryentityref); } public void handle(clientchangemessage message) { var state = this.data; if (state.clientbillingmessage != null) { handle(state.clientbillingmessage); } } public void handle(caresysinvoicelineinsertmessage message) { //first check funder //if funder not there store message in saga //if funder there check client //if client not there put message in saga // if funder , client there execute message delete saga } } here scenario:
1)if receive clientbillingmessage client , funder not there , store message in saga.
2)if funder message comes gets executed , saga still persists waiting client message
3)now if client message comes runs clientbillingsaga's client message handler first hence existing clientbillingsaga still persists , after goes , executes handler inside clientsaga client message.
my question: there way can order execution of these 2 saga. found ispecifymessagehandlerordering interface deals handling of messages don't think can use saga.
sagas meant synchronising events on time.
you can collect data need form messages handled in saga state , once you have handled proceed send command/publish event business logic processed handler.
note: actual work (business logic , domain data manipulation) should done in separate handler (to comply srp , unit of work).
hope helps
Comments
Post a Comment