예제 #1
0
        public ChangeTrackerActor()
        {
            var mat = Context.Materializer();

            var(queue, source) = Source.Queue <AppInfo>(10, OverflowStrategy.DropHead).PreMaterialize(mat);

            _appInfos = queue;

            var hub = source.ToMaterialized(BroadcastHub.Sink <AppInfo>(), Keep.Right);


            Receive <QueryChangeSource>("QueryChanedSource", (changeSource, reporter) => reporter.Compled(OperationResult.Success(new AppChangedSource(hub.Run(mat)))));
            Receive <AppInfo>(ai => _appInfos.OfferAsync(ai).PipeTo(Self));
            Receive <IQueueOfferResult>(r =>
            {
                switch (r)
                {
                case QueueOfferResult.Failure f:
                    Log.Error(f.Cause, "Error In Change Tracker");
                    break;

                case QueueOfferResult.QueueClosed _:
                    Log.Warning("Unexpectem Tracker Queue Close.");
                    break;
                }
            });
        }
예제 #2
0
        private void Working()
        {
            Receive <ChannelData <float> >(msg =>
            {
                _queue.OfferAsync(msg).PipeTo(Self);
            });

            Receive <IQueueOfferResult>(enqueueTask =>
            {
                enqueueTask.Match()
                .With <QueueOfferResult.Enqueued>(msg => ++ _samplesEnqueued)
                .With <QueueOfferResult.Dropped>(msg => Log.Warning("Signal Adjuster dropped a sample. Total dropped:{0}", ++_samplesDropped))
                .With <QueueOfferResult.Failure>(msg => throw msg.Cause)
                .With <QueueOfferResult.QueueClosed>(msg => throw new Exception("The stream queue was closed."));
            });

            Stash.UnstashAll();
        }
예제 #3
0
        public async Task RunnableGraphMadeOfBackpressuredQueueAndActorRefWithAckWorksAsExpected()
        {
            const int MAX = 4;

            Source <int, ISourceQueueWithComplete <int> > source = Source.Queue <int>(MAX, OverflowStrategy.Backpressure);
            TestProbe probe = CreateTestProbe();
            Sink <IEnumerable <int>, NotUsed> sink = Sink.ActorRefWithAck <IEnumerable <int> >(probe.Ref, "init", "ack", "complete");

            RunnableGraph <ISourceQueueWithComplete <int> > rg = RunnableGraph.FromGraph(GraphDsl.Create(source, sink, Keep.Left,
                                                                                                         (builder, source_, sink_) =>
            {
                UniformFanOutShape <int, int> broadcaster = builder.Add(new Broadcast <int>(2));
                UniformFanInShape <IEnumerable <int>, IEnumerable <int> > merger = builder.Add(new Merge <IEnumerable <int> >(2));

                var f1 = Flow.Create <int>().Aggregate(new List <int>(),
                                                       (agg, curr) =>
                {
                    agg.Add(curr);
                    return(agg);
                }).Select(list => list.AsEnumerable());
                var f2 = Flow.Create <int>().Aggregate(new List <int>(),
                                                       (agg, curr) =>
                {
                    agg.Add(curr);
                    return(agg);
                }).Select(list => list.AsEnumerable());

                builder.From(source_).To(broadcaster.In);
                builder.From(broadcaster.Out(0)).Via(f1).To(merger.In(0));
                builder.From(broadcaster.Out(1)).Via(f2).To(merger.In(1));
                builder.From(merger.Out).To(sink_);

                return(ClosedShape.Instance);
            }));

            ISourceQueueWithComplete <int> q = rg.Run(_materializer);

            probe.ExpectMsg <string>((msg, sender) =>
            {
                if (msg != "init")
                {
                    throw new InvalidOperationException($"Expected: init. Found: {msg}");
                }
                sender.Tell("ack");
            });
            await q.OfferAsync(2);

            await q.OfferAsync(4);

            await q.OfferAsync(8);

            await q.OfferAsync(16);

            q.Complete();
            await q.WatchCompletionAsync();

            probe.ExpectMsg <IEnumerable <int> >((msg, sender) =>
            {
                Assert.Equal(new[] { 2, 4, 8, 16 }.AsEnumerable(), msg);
                sender.Tell("ack");
            });
            probe.ExpectMsg <IEnumerable <int> >((msg, sender) =>
            {
                Assert.Equal(new[] { 2, 4, 8, 16 }.AsEnumerable(), msg);
                sender.Tell("ack");
            });

            probe.ExpectMsg("complete");
            probe.ExpectNoMsg();
        }