예제 #1
0
        public SagaHubActor(IPublisher publisher,
                            IPersistentChildsRecycleConfiguration recycleConf,
                            ISagaProducer <TSaga> sagaProducer) : base(recycleConf, typeof(TSaga).Name)
        {
            _acceptMessagesSagaIds = sagaProducer.Descriptor.AcceptMessages.ToDictionary(m => m.MessageType, m => m.CorrelationField);

            _sagaStartMessages = new HashSet <Type>(sagaProducer.KnownDataTypes.Where(t => typeof(DomainEvent).IsAssignableFrom(t)));
            _publisher         = publisher;
        }
예제 #2
0
        public SagaActor(ISagaProducer <TSaga> producer,
                         IPublisher publisher,
                         ISnapshotsPersistencePolicy snapshotsPersistencePolicy,
                         IConstructAggregates aggregatesConstructor)
            : base(aggregatesConstructor,
                   snapshotsPersistencePolicy,
                   publisher)
        {
            _producer = producer;
            _sagaStartMessageTypes = new HashSet <Type>(producer.KnownDataTypes.Where(t => typeof(DomainEvent).IsAssignableFrom(t)));
            _sagaIdFields          = producer.Descriptor.AcceptMessages.ToDictionary(m => m.MessageType, m => m.CorrelationField);

            //id from name is used due to saga.Data can be not initialized before messages not belonging to current saga will be received
            Command <IMessageMetadataEnvelop <DomainEvent> >(m =>
            {
                var msg = m.Message;
                Monitor.IncrementMessagesReceived();
                if (_sagaStartMessageTypes.Contains(msg.GetType()))
                {
                    _saga = _producer.Create(msg);
                    State = _saga.Data;
                }

                ProcessSaga(msg, m.Metadata);
            }, e => GetSagaId(e.Message) == Id);

            Command <IMessageMetadataEnvelop <IFault> >(m =>
            {
                var fault = m.Message;
                Monitor.IncrementMessagesReceived();
                ProcessSaga(fault, m.Metadata);
            }, fault => fault.Message.SagaId == Id);

            _sagaProducedEntry = new ProcessEntry(Self.Path.Name, SagaActorLiterals.PublishingCommand, SagaActorLiterals.SagaProducedACommand);

            _exceptionOnTransit = new ProcessEntry(Self.Path.Name, SagaActorLiterals.CreatedFaultForSagaTransit, SagaActorLiterals.SagaTransitCasedAndError);
        }