예제 #1
0
        private async Task <ISaga> ProcessSagaAsync(
            IDomainEvent domainEvent,
            ISagaId sagaId,
            SagaDetails details,
            CancellationToken cancellationToken)
        {
            try {
                _log.Verbose(() => $"Loading saga '{details.SagaType.PrettyPrint()}' with ID '{sagaId}'");

                return(await _sagaStore.UpdateAsync <ISaga>(
                           sagaId,
                           details,
                           domainEvent.Metadata.SourceId,
                           (s, c) => UpdateSagaAsync(s, domainEvent, details, c),
                           cancellationToken)
                       .ConfigureAwait(false));
            } catch (Exception e) {
                var handled = await _sagaErrorHandler.HandleAsync(
                    sagaId,
                    details,
                    e,
                    cancellationToken)
                              .ConfigureAwait(false);

                if (handled)
                {
                    return(null);
                }

                _log.Error(e,
                           $"Failed to process domain event '{domainEvent.EventType}' for saga '{details.SagaType.PrettyPrint()}'");
                throw;
            }
        }
예제 #2
0
        private async Task ProcessSagaAsync(
            IDomainEvent domainEvent,
            ISagaId sagaId,
            SagaDetails details,
            CancellationToken cancellationToken)
        {
            try
            {
                _logger.LogTrace(
                    "Loading saga {SagaType} with ID {Id}",
                    details.SagaType.PrettyPrint(),
                    sagaId);

                await _sagaStore.UpdateAsync(
                    sagaId,
                    details.SagaType,
                    domainEvent.Metadata.EventId,
                    (s, c) => UpdateSagaAsync(s, domainEvent, details, c),
                    cancellationToken)
                .ConfigureAwait(false);
            }
            catch (Exception e)
            {
                var handled = await _sagaErrorHandler.HandleAsync(
                    sagaId,
                    details,
                    e,
                    cancellationToken)
                              .ConfigureAwait(false);

                if (handled)
                {
                    return;
                }

                _logger.LogError(
                    "Failed to process domain event {DomainEventType} for saga {SagaType}",
                    domainEvent.EventType,
                    details.SagaType.PrettyPrint());
                throw;
            }
        }
예제 #3
0
        private async Task ProcessSagaAsync(
            IDomainEvent domainEvent,
            ISagaId sagaId,
            SagaDetails details,
            CancellationToken cancellationToken)
        {
            try
            {
                _log.Verbose(() => $"Loading saga '{details.SagaType.PrettyPrint()}' with ID '{sagaId}'");

                await _sagaStore.UpdateAsync(
                    sagaId,
                    details.SagaType,
                    domainEvent.Metadata.EventId,
                    (s, c) => UpdateSagaAsync(s, domainEvent, details, c),
                    cancellationToken)
                .ConfigureAwait(false);
            }
            catch (Exception e)
            {
                // Search for a specific SagaErrorHandler<Saga> based on saga type
                ISagaErrorHandler specificSagaErrorHandler = _sagaErrorHandlerFactory(details.SagaType);

                bool handled = specificSagaErrorHandler != null ?
                               await specificSagaErrorHandler.HandleAsync(sagaId, details, e, cancellationToken).ConfigureAwait(false) :
                               await _sagaErrorHandler.HandleAsync(sagaId, details, e, cancellationToken).ConfigureAwait(false);

                if (handled)
                {
                    return;
                }

                _log.Error(e, $"Failed to process domain event '{domainEvent.EventType}' for saga '{details.SagaType.PrettyPrint()}'");
                throw;
            }
        }