示例#1
0
        //private async Task<bool> ReadStreamAsync(string stream, IQueue<ProjectionEventData> queue, CancellationToken cancellationToken = default(CancellationToken))
        //{
        //    _logger.LogDebug("ReadFromStreamAsync {Stream}", stream);

        //    var cred = _connectionProvider.OpsCredentials;
        //    var src = _connectionProvider.Connection.Value;

        //    StreamEventsSlice slice;

        //    long sliceStart = StreamPosition.Start;


        //    do
        //    {
        //        _logger.LogTrace("Reading Slice from {0}", sliceStart);

        //        slice = await src.ReadStreamEventsForwardAsync(stream, sliceStart, 500, true, cred);
        //        _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 false;
        //            }

        //            var de = ev.Event.ToDomainEvent();
        //            var desc = new ProjectionEventData
        //            {
        //                EventData = de,
        //                EventNumber = ev.OriginalEventNumber
        //            };

        //            _logger.LogTrace("Enqueue Event @{0}", desc);
        //            await queue.EnqueueAsync(desc);

        //        }

        //    } while (!slice.IsEndOfStream);

        //    return true;
        //}


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

            StreamEventsSlice slice;

            long sliceStart = StreamPosition.Start;

            do
            {
                _logger.LogTrace("Reading Slice from {0}", sliceStart);

                slice = await src.ReadStreamEventsForwardAsync(stream, sliceStart, 500, true, cred);

                _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);
                        }
                    }
                    catch (Exception 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:0.0000} ms", stream, context.ProjectorId, sw.ElapsedMilliseconds);

            return(context.Status);
        }
示例#2
0
        private async Task InitProjectorInternal(CancellationToken cancellationToken, IReadModelProjector projector)
        {
            var projectorId = projector.GetType().FullName;

            projector.Initialize(cancellationToken);

            _logger.LogInformation("Initialize Projector {ProjectorName}", projectorId);

            await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusPending, "Starting");

            var context =
                new EventStoreProjectionContext(_loggerFactory, _connectionProvider, _entityStore, projector)
            {
                StreamName  = projector.StreamName,
                ProjectorId = projectorId
            };

            projector.Context = context;

            await _cache.RemoveByPrefixAsync(CacheKeys.Create <ProjectionStatus>());

            var status = await _entityStore.LoadAsync <ProjectionStatus>(projectorId, cancellationToken);

            context.Status = status.Entity;

            if (status.IsNew)
            {
                _logger.LogDebug("Starting Empty Initialization for Projector {Projector}", projectorId);

                await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusPending, "StartingInitialization");

                await context.StartInitializationModeAsync();

                await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusPending, "InitializationStartingStreamReading");

                try
                {
                    var tempStatus = await ReadStreamAsync(context.StreamName, context, cancellationToken);

                    if (tempStatus != null)
                    {
                        status.Entity.LastCheckPoint = tempStatus.LastCheckPoint;
                        status.Entity.ModifiedOnUtc  = tempStatus.ModifiedOnUtc;
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Error ReadStreamAsync");
                    throw;
                }

                await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusPending, "InitializationStartingCopy");

                try
                {
                    await projector.CopyEntitiesAsync(context.EntityStore, _entityStore, cancellationToken);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Error CopyEntitites");
                    throw;
                }

                await context.StopInitializationModeAsync();

                await _entityStore.SaveAsync(status, cancellationToken);

                await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusPending, "InitializationFinished");
            }

            cancellationToken.ThrowIfCancellationRequested();
            _logger.LogDebug("Starting Subscription on EventStore for Projector {Projector}", context.ProjectorId);
            await context.StartSubscription(cancellationToken);

            await UpdateInitializationStatusAsync(cancellationToken, projectorId, ProjectionInitializationStatus.StatusReady, "Startet");
        }