private void GenerateReportAsync(OpenLogFileViewModel viewModel)
        {
            logFileRptGeneratorService.InitializeReport();

            viewModel.OverallProgress    = 0;
            viewModel.IsGeneratingReport = true;

            //var sourceQueue = Source.Queue<LogRptDto>(int.MaxValue, OverflowStrategy.Fail)
            //                                           .SelectAsyncUnordered(int.MaxValue, l => logFileRptGeneratorService.GetCheckInforInUseOuts(l, viewModel.LogFiles))
            //                                           .To(Sink.ActorRef<Tuple<bool, LogRptDto>>(logFilesExcelProviderActor, logFileRptGeneratorService.GetReportRows()))
            //                                           .Run(Context.Materializer());

            var g = RunnableGraph.FromGraph(GraphDsl.Create(b =>
            {
                var source = Source.From(viewModel.LogFiles);

                var sink = Sink.ActorRef <Tuple <bool, LogRptDto> >(logFilesExcelProviderActor, logFileRptGeneratorService.GetReportRows());

                var parsing = Flow.Create <LogFile>()
                              .Select(x =>
                {
                    viewModel.OverallProgress++;
                    var parseTask = logFilesParsingService.ParseLogFileEventsAsync(x);
                    parseTask.ContinueWith(t => denialsRptGeneratorService.Aggregate(t.Result));
                    return(parseTask.Result);
                }).WatchTermination((_, o) => { o.ContinueWith(t => getCheckInsActor.Tell(viewModel)); return(_); });
                //.WatchTermination((_,u)=>u.PipeTo(getCheckInsActor));
                //TODO: create new actor to run getCheckIns                ===^
                //Akka.Done
                //Akka.Actor.Status.Failure;
                var reportGen = Flow.Create <LogFile>()
                                .SelectAsyncUnordered(int.MaxValue, logFileRptGeneratorService.GenerateReport)
                                .Recover(exception =>
                {
                    throw exception;
                })
                                .SelectMany(x => x);
                //var getCheckIns = Flow.Create<LogRptDto>()
                //                        .SelectAsyncUnordered(int.MaxValue, x => getCheckInsActor.Tell(x))

                //var getCheckIns = Flow.Create<LogRptDto>()
                //                .SelectAsyncUnordered(int.MaxValue, l => logFileRptGeneratorService.GetCheckInforInUseOuts(l, viewModel.LogFiles));

                b.From(source).Via(parsing).Via(reportGen).To(Sink.ForEach <LogRptDto>(l => getCheckInsActor.Tell(l)));//.Via(getCheckIns).To(sink);

                return(ClosedShape.Instance);
            }));

            g.Run(Context.Materializer());
        }
 public OpenLogFileCoordinatorActor(OpenLogFileViewModel viewModel)
 {
     ProgressTellerActor = Context.ActorOf(Props.Create(() => new ProgressTellerActor(viewModel)),
                                           ActorPaths.ProgressTellerActor.Name);
     LogFileReportGeneratorActor = Context.ActorOf(Context.DI().Props <LogFileReportGeneratorActor>(),
                                                   ActorPaths.LogFileReportGeneratorActor.Name);
     Receive <string>(message => {
         if (message == "start")
         {
             LogFileReportGeneratorActor.Tell(viewModel);
         }
         else if (message == "done")
         {
             viewModel.IsGeneratingReport = false;
         }
     });
 }
        public GetCheckInsActor(ILogFileRptGeneratorService logFileRptGeneratorService)
        {
            logFilesExcelProviderActor = Context.ActorOf(Context.DI().Props <LogFilesExcelProviderActor>(),
                                                         ActorPaths.logFilesExcelProviderActor.Name);
            var sourceQueue = Source.Queue <LogRptDto>(0, OverflowStrategy.Backpressure)
                              .Recover(ex => throw ex)
                              .SelectAsyncUnordered(int.MaxValue, l => logFileRptGeneratorService.GetCheckInforInUseOuts(l, vm.LogFiles))
                              .ToMaterialized(Sink.ActorRef <Tuple <bool, LogRptDto> >(logFilesExcelProviderActor, logFileRptGeneratorService.GetReportRows()), Keep.Left)
                              .Run(Context.Materializer());

            Receive <OpenLogFileViewModel>(vmodel =>
            {
                vm = vmodel;
                Stash.UnstashAll();
                BecomeStacked(() =>
                {
                    Receive <LogRptDto>(l => sourceQueue.OfferAsync(l));
                });
            });

            ReceiveAny(_ => Stash.Stash());
            this.logFileRptGeneratorService = logFileRptGeneratorService;
        }
Example #4
0
 public ProgressTellerActor(OpenLogFileViewModel viewModel)
 {
     Receive <bool>(isGeneratingRpt => viewModel.IsGeneratingReport = true);
     Receive <int>(OverallProgress => viewModel.OverallProgress     = OverallProgress);
 }