예제 #1
0
 public DispatchToSagas(
     ILog log,
     IResolver resolver,
     ISagaStore sagaStore,
     ISagaDefinitionService sagaDefinitionService,
     ISagaErrorHandler sagaErrorHandler)
 {
     _log                   = log;
     _resolver              = resolver;
     _sagaStore             = sagaStore;
     _sagaDefinitionService = sagaDefinitionService;
     _sagaErrorHandler      = sagaErrorHandler;
 }
예제 #2
0
 public DispatchToSagas(
     ILogger <DispatchToSagas> logger,
     IServiceProvider serviceProvider,
     ISagaStore sagaStore,
     ISagaDefinitionService sagaDefinitionService,
     ISagaErrorHandler sagaErrorHandler,
     ISagaUpdateResilienceStrategy sagaUpdateLog)
 {
     _logger                = logger;
     _serviceProvider       = serviceProvider;
     _sagaStore             = sagaStore;
     _sagaDefinitionService = sagaDefinitionService;
     _sagaErrorHandler      = sagaErrorHandler;
     _sagaUpdateLog         = sagaUpdateLog;
 }
예제 #3
0
 public DispatchToSagas(
     ILog log,
     IResolver resolver,
     ISagaStore sagaStore,
     ISagaDefinitionService sagaDefinitionService,
     ISagaErrorHandler sagaErrorHandler,
     ISagaUpdateResilienceStrategy sagaUpdateLog)
 {
     _log                   = log;
     _resolver              = resolver;
     _sagaStore             = sagaStore;
     _sagaDefinitionService = sagaDefinitionService;
     _sagaErrorHandler      = sagaErrorHandler;
     _sagaUpdateLog         = sagaUpdateLog;
 }
예제 #4
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;
            }
        }