public void Sends_read_events_to_subscriber()
        {
            var reader = Sys.ActorOf(conf =>
            {
                conf.Receive <ReadIndexedProjectionStreamRequest>((r, ctx) =>
                {
                    for (var i = 1; i <= 3; i++)
                    {
                        var e = MockPersistedStreamEvent.Create(new TestEvent(), i, i);
                        ctx.Sender.Tell(new ReadIndexedProjectionStreamResponse(r.RequestID, e));
                    }

                    ctx.Sender.Tell(new ReadIndexedProjectionStreamFinished(r.RequestID, 3));
                });
            });

            var request = new ProjectionSubscriptionRequest(new ProjectionStreamQuery(), 0);

            var worker = Sys.ActorOf <ProjectionReplayWorker>();

            worker.Tell(new InitializeProjectionReplayWorker(reader, TestActor, request, 3, new GlobalOptions()));

            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 1);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 2);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 3);
            ExpectMsg <ProjectionReplayFinished>();
        }
Example #2
0
        private void StartProjectionReplayWorker(ProjectionSubscriptionRequest ps)
        {
            var props = _replayWorkerProps.WithSupervisorStrategy(new OneForOneStrategy(ex => Directive.Stop));

            var worker = Context.ActorOf(props);

            worker.Tell(new InitializeProjectionReplayWorker(_reader, Sender, ps, _currentSequence, _options));
        }
        public void Requests_events_to_reader()
        {
            var request = new ProjectionSubscriptionRequest(new ProjectionStreamQuery(), 0);
            var worker  = Sys.ActorOf <ProjectionReplayWorker>();

            worker.Tell(new InitializeProjectionReplayWorker(TestActor, ActorRefs.Nobody, request, 1, new GlobalOptions()));

            ExpectMsg <ReadIndexedProjectionStreamRequest>();
        }
        public void Worker_requests_until_all_events_are_read()
        {
            var canFinish = false;

            var reader = Sys.ActorOf(conf =>
            {
                conf.Receive <ReadIndexedProjectionStreamRequest>((r, ctx) =>
                {
                    var start = r.InitialSequence;
                    int end;

                    if (canFinish)
                    {
                        end = start + r.Count;
                    }
                    else
                    {
                        end = start + 2;
                    }

                    for (var i = start; i <= end; i++)
                    {
                        var e = MockPersistedStreamEvent.Create(new TestEvent(), i, i);
                        ctx.Sender.Tell(new ReadIndexedProjectionStreamResponse(r.RequestID, e));
                    }

                    ctx.Sender.Tell(new ReadIndexedProjectionStreamFinished(r.RequestID, end));
                });
            });

            var request = new ProjectionSubscriptionRequest(new ProjectionStreamQuery(), 0);
            var options = new GlobalOptions {
                ProjectionReplayRetryInterval = TimeSpan.FromMilliseconds(600)
            };
            var worker = Sys.ActorOf <ProjectionReplayWorker>();

            worker.Tell(new InitializeProjectionReplayWorker(reader, TestActor, request, 5, new GlobalOptions()));

#pragma warning disable 4014
            Task.Delay(500).ContinueWith(_ => canFinish = true);
#pragma warning restore 4014

            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 1);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 2);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 3);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 4);
            ExpectMsg <ProjectionReplayEvent>(m => m.Event.StreamSequence == 5);
            ExpectMsg <ProjectionReplayFinished>();
        }
        public void Worker_terminates_on_ReadFinished()
        {
            var reader = Sys.ActorOf(conf =>
            {
                conf.Receive <ReadIndexedProjectionStreamRequest>((r, ctx) =>
                {
                    ctx.Sender.Tell(new ReadIndexedProjectionStreamFinished(r.RequestID, 0));
                });
            });

            var request = new ProjectionSubscriptionRequest(new ProjectionStreamQuery(), 0);

            var worker = Sys.ActorOf <ProjectionReplayWorker>();

            worker.Tell(new InitializeProjectionReplayWorker(reader, ActorRefs.Nobody, request, 0, new GlobalOptions()));

            Watch(worker);
            ExpectTerminated(worker);
        }
Example #6
0
        private void Uninitialized()
        {
            Receive <InitializeProjection>(async ini =>
            {
                try
                {
                    _streams = ini.ProjectionStreams;
                    _options = ini.Options;

                    var query        = BuildQuery();
                    ProjectionStream = query.ProjectionStream;

                    await OnInit();

                    var lastKnownState = await GetLastKnownState();

                    // if the projection is new or id is changed, the projection needs to be rebuilt
                    if (lastKnownState != null && !ProjectionStream.Equals(lastKnownState.ProjectionStream))
                    {
                        await PrepareToRebuild();
                    }

                    var request    = new ProjectionSubscriptionRequest(query, lastKnownState?.ProjectionSequence ?? 0);
                    _lastRequestId = request.RequestID;
                    _streams.Tell(request);

                    Become(Replaying);

                    Sender.Tell(InitializationResult.Successful());
                }
                catch (Exception ex)
                {
                    Sender.Tell(InitializationResult.Failed(ex));
                    throw;
                }
            });
        }
Example #7
0
        public InitializeProjectionReplayWorker(IActorRef reader, IActorRef subscriber, ProjectionSubscriptionRequest subscriptionRequest, int lastSequenceToRead, GlobalOptions options)
        {
            Argument.RequiresNotNull(reader, nameof(reader));
            Argument.RequiresNotNull(subscriber, nameof(subscriber));
            Argument.RequiresNotNull(subscriptionRequest, nameof(subscriptionRequest));
            Argument.RequiresNotNull(options, nameof(options));

            this.Reader              = reader;
            this.Subscriber          = subscriber;
            this.SubscriptionRequest = subscriptionRequest;
            this.LastSequenceToRead  = lastSequenceToRead;
            this.Options             = options;
        }