コード例 #1
0
        private Func <EventStoreCatchUpSubscription, ResolvedEvent, Task> EventAppeared(
            ProjectionHandler projection,
            string projectionName
            ) => async(_, e) =>
        {
            // check system event
            if (e.OriginalEvent.EventType.StartsWith("$"))
            {
                return;
            }

            var @event = this._serializer.Deserialize(Type.GetType(e.Event.EventType), Encoding.UTF8.GetString(e.Event.Data));

            if (@event == null)
            {
                throw new ArgumentNullException(nameof(@event));
            }

            await projection.Handle(@event);

            await _checkpointStore.SetLastCheckpoint(projectionName, e.OriginalPosition);

            var metadata = this._serializer.Deserialize <EventMetadata>(Encoding.UTF8.GetString(e.Event.Metadata));

            ISnapshotter snapshotter = _snapshotters.FirstOrDefault(
                x => x.ShouldTakeSnapshot(Type.GetType(metadata.AggregateAssemblyQualifiedName), e) && !metadata.IsSnapshot);

            if (snapshotter != null)
            {
                await snapshotter.TakeSnapshot(e.OriginalStreamId);
            }
        };
コード例 #2
0
        private async Task StartProjection(ProjectionHandler projection)
        {
            var projectionTypeName = projection.GetType().FullName;

            Position lastCheckpoint = await _checkpointStore.GetLastCheckpoint <Position>(projectionTypeName);

            var settings = new CatchUpSubscriptionSettings(
                _maxLiveQueueSize,
                _readBatchSize,
                false,
                false,
                projectionTypeName
                );

            _connection.SubscribeToAllFrom(
                lastCheckpoint,
                settings,
                EventAppeared(projection, projectionTypeName),
                LiveProcessingStarted(projection, projectionTypeName),
                SubscriptionDropped(projection, projectionTypeName)
                );
        }
コード例 #3
0
        private Action <EventStoreCatchUpSubscription, SubscriptionDropReason, Exception> SubscriptionDropped(ProjectionHandler projection, string projectionName)
        => (subscription, reason, ex) =>
        {
            subscription.Stop();

            switch (reason)
            {
            case SubscriptionDropReason.UserInitiated:
                break;

            case SubscriptionDropReason.SubscribingError:
            case SubscriptionDropReason.ServerError:
            case SubscriptionDropReason.ConnectionClosed:
            case SubscriptionDropReason.CatchUpError:
            case SubscriptionDropReason.ProcessingQueueOverflow:
            case SubscriptionDropReason.EventHandlerException:
                Task.Run(() => StartProjection(projection));
                break;

            default:
                break;
            }
        };
コード例 #4
0
 private static Action <EventStoreCatchUpSubscription> LiveProcessingStarted(ProjectionHandler projection, string projectionName)
 => _ =>
 {
 };