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; } }
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; } }
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; } }