private async Task EventAppeared(EventStoreCatchUpSubscription sub, ResolvedEvent evt) { _logger.LogTrace("EventAppeared {SubscriptionName} {Stream} Projector {ProjectorId}", sub.SubscriptionName, sub.StreamId, ProjectorId); var de = evt.Event.ToDomainEvent(); var desc = new ProjectionEventData { EventData = de, EventNumber = evt.OriginalEventNumber }; // if (_useQueue) // { // _logger.LogTrace("Enqueue Event {@0}", desc); // await Queue.EnqueueAsync(desc).ConfigureAwait(false); // } // else // { await HandleEventAsync(desc).ConfigureAwait(false); // } }
private async Task <ProjectionStatus> ReadStreamAsync(string stream, EventStoreProjectionContext context, CancellationToken cancellationToken = default(CancellationToken)) { _logger.LogDebug("ReadFromStreamAsync {Stream} {ProjectorId}", stream, context.ProjectorId); var sw = Stopwatch.StartNew(); var cred = _connectionProvider.OpsCredentials; //var src = await _connectionProvider.GetActiveConnection().ConfigureAwait(false); var src = _connectionProvider.GetActiveConnection(); StreamEventsSlice slice; long sliceStart = StreamPosition.Start; do { _logger.LogTrace("Reading Slice from {0}", sliceStart); slice = await src.ReadStreamEventsForwardAsync(stream, sliceStart, _options.InitReadCount, true, cred).ConfigureAwait(false); _logger.LogTrace("Next Event: {0} , IsEndOfStream: {1}", slice.NextEventNumber, slice.IsEndOfStream); sliceStart = slice.NextEventNumber; foreach (var ev in slice.Events) { if (cancellationToken.IsCancellationRequested) { _logger.LogWarning("Initialization Cancelled"); return(null); } try { var de = ev.Event.ToDomainEvent(); if (de != null) { var entry = new ProjectionEventData { EventData = de, EventNumber = ev.OriginalEventNumber }; await context.HandleEventAsync(entry).ConfigureAwait(false); } } catch (Exception e) when(LogError(e)) { _logger.LogError(e, "Error Reading Event: {Stream} {ProjectorId} {OriginalEventNumber}", stream, context.ProjectorId, ev.OriginalEventNumber); } } } while (!slice.IsEndOfStream); _logger.LogDebug("ReadFromStreamAsync {Stream} {ProjectorId} Finished in {Elapsed} ms", stream, context.ProjectorId, sw.ElapsedMilliseconds); return(context.Status); }
internal async Task HandleEventAsync(ProjectionEventData entry) { var state = new Dictionary <string, object> { { "EventType", entry.EventData.GetType().FullName }, { "EventId", entry.EventData.Id }, { "EventNumber", entry.EventNumber }, { "ProjectorType", _projector.GetType().FullName }, { "StreamName", StreamName } }; using (_logger.BeginScope(state)) { var sw = Stopwatch.StartNew(); _logger.LogDebug("HandleEventAsync Item {EventNumber} {StreamName} Started", entry.EventNumber, StreamName); if (entry.EventNumber > Status.LastCheckPoint) { CurrentCheckPoint = entry.EventNumber; try { await _projector.ProcessEventAsync(entry.EventData).ConfigureAwait(false); Status.LastCheckPoint = entry.EventNumber; Status.ModifiedOnUtc = DateTime.UtcNow; if (!IsInitializing) { await EntityStore.UpdateItemAsync(Status, _cancellationToken).ConfigureAwait(false); } } catch (Exception e) when(LogError(e)) { _logger.LogError(e, "Error while Processing Event {EventNumber} from {StreamName} {ProjectorId}", entry.EventNumber, StreamName, ProjectorId); } } else { _logger.LogWarning("Duplicate Event Handling {EventNumber} {StreamName}", entry.EventNumber, StreamName); } sw.Stop(); _logger.LogDebug("HandleEventAsync Item {EventNumber} {StreamName} finished in {Elapsed} ms", entry.EventNumber, StreamName, sw.ElapsedMilliseconds); } }
internal async Task HandleEventAsync(ProjectionEventData entry) { _logger.LogTrace("Handled Item {EventNumber} {StreamName} {ProjectorId}", entry.EventNumber, StreamName, ProjectorId); CurrentCheckPoint = entry.EventNumber; try { await _projector.ProcessEventAsync(entry.EventData); Status.LastCheckPoint = entry.EventNumber; Status.ModifiedOnUtc = DateTime.UtcNow; await EntityStore.UpdateItemAsync(Status, _cancellationToken); } catch (Exception e) { _logger.LogError(e, "Error while Processing Event {EventNumber} from {StreamName} {ProjectorId}", entry.EventNumber, StreamName, ProjectorId); throw; } }