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

            // }
        }
Beispiel #2
0
        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;
            }
        }