void InvokeSagaNotFoundHandlers(ActiveSagaInstance sagaInstance) { logger.InfoFormat("Could not find a saga for the message type {0} with id {1}. Going to invoke SagaNotFoundHandlers.", sagaInstance.MessageToProcess.GetType().FullName, currentContext.TransportMessage.Id); foreach (var handler in currentContext.Builder.BuildAll <IHandleSagaNotFound>()) { logger.DebugFormat("Invoking SagaNotFoundHandler: {0}", handler.GetType().FullName); handler.Handle(sagaInstance.MessageToProcess); } }
public void Invoke(HandlerInvocationContext context, Action next) { var saga = context.MessageHandler.Instance as ISaga; if (saga == null) { next(); return; } currentContext = context; var sagaInstanceState = new ActiveSagaInstance(saga); //so that other behaviors can access the saga context.Set(sagaInstanceState); var loadedEntity = TryLoadSagaEntity(saga, context.LogicalMessage); if (loadedEntity == null) { //if this message are not allowed to start the saga if (!Features.Sagas.ShouldMessageStartSaga(sagaInstanceState.SagaType, context.LogicalMessage.MessageType)) { sagaInstanceState.MarkAsNotFound(); InvokeSagaNotFoundHandlers(); return; } sagaInstanceState.AttachNewEntity(CreateNewSagaEntity(sagaInstanceState.SagaType)); } else { sagaInstanceState.AttachExistingEntity(loadedEntity); } if (IsTimeoutMessage(context.LogicalMessage)) { context.MessageHandler.Invocation = HandlerInvocationCache.InvokeTimeout; } next(); if (sagaInstanceState.NotFound) { return; } if (saga.Completed) { if (!sagaInstanceState.IsNew) { SagaPersister.Complete(saga.Entity); } if (saga.Entity.Id != Guid.Empty) { NotifyTimeoutManagerThatSagaHasCompleted(saga); } logger.Debug(string.Format("Saga: '{0}' with Id: '{1}' has completed.", sagaInstanceState.SagaType.FullName, saga.Entity.Id)); } else { if (sagaInstanceState.IsNew) { SagaPersister.Save(saga.Entity); } else { SagaPersister.Update(saga.Entity); } } }
void InvokeSagaNotFoundHandlers(ActiveSagaInstance sagaInstance) { logger.InfoFormat("Could not find a saga for the message type {0} with id {1}. Going to invoke SagaNotFoundHandlers.", sagaInstance.MessageToProcess.GetType().FullName, currentContext.TransportMessage.Id); foreach (var handler in currentContext.Builder.BuildAll<IHandleSagaNotFound>()) { logger.DebugFormat("Invoking SagaNotFoundHandler: {0}",handler.GetType().FullName); handler.Handle(sagaInstance.MessageToProcess); } }