private void StartAnalysis(StartAnalysisRequest request) { var passedDueWorkItemsActor = Context.ActorOf(Context.DI().Props <PassedDueWorkItemsActor>(), "passed-due-work-items-actor"); var passedDueWorkItemsTask = passedDueWorkItemsActor.Ask <ActorResponse <IReadOnlyList <string> > >( _iterationWorkItemsRetriever.GetWorkItems(IterationTimeFrame.Current)); var result = passedDueWorkItemsTask.Result; _managersReportMessageSender.SendMessages(result.Content).Wait(); Context.Stop(Self); Sender.Tell(new AnalysisCompleteResponse()); }
private void HandleStartAnalysisRequest(StartAnalysisRequest obj) { // This is supposed to run on Mondays bi-weekly at the starting of the new iteration. if (_currentIterationInfoOptions.Value.StartDate.Date != DateTime.Now.Date) { Context.Stop(Self); Sender.Tell(new AnalysisCompleteResponse()); } var currentIterationWorkItems = _workItemsRetriever.GetWorkItems(IterationTimeFrame.Previous); // Creating the subordinate actors. var estimateWorkItemActor = Context.ActorOf(Context.DI().Props <EstimateWorkItemsActor>(), "estimate-work-item-actor"); var descriptiveTitleActor = Context.ActorOf(Context.DI().Props <DescriptiveTitleActor>(), "descriptive-title-actor"); var descriptionActor = Context.ActorOf(Context.DI().Props <DescriptionActor>(), "description-actor"); var longCodeCompleteActor = Context.ActorOf(Context.DI().Props <LongCodeCompleteActor>(), "long-code-complete-actor"); var greatPreviousIterationActor = Context.ActorOf(Context.DI().Props <GreatPreviousIterationActor>(), "great-previous-iteration-actor"); var openWorkItemsActor = Context.ActorOf(Context.DI().Props <OpenWorkItemsActor>(), "open-work-items-actor"); // Running the actors. var tasks = new List <Task>(); var estimateWorkItemTask = estimateWorkItemActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(estimateWorkItemTask); var descriptiveTitleTask = descriptiveTitleActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(descriptiveTitleTask); var descriptionTask = descriptionActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(descriptionTask); var longCodeCompleteTask = longCodeCompleteActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(longCodeCompleteTask); var greatPreviousIterationTask = greatPreviousIterationActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(greatPreviousIterationTask); var openWorkItemsTask = openWorkItemsActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(openWorkItemsTask); // Waiting for all the of the actors to finish their work and return a response back. Task.WaitAll(tasks.ToArray()); // Collecting the results from each actor. var messages = new List <string>(); messages.AddRange(estimateWorkItemTask.Result.Content); messages.AddRange(descriptiveTitleTask.Result.Content); messages.AddRange(openWorkItemsTask.Result.Content); messages.AddRange(longCodeCompleteTask.Result.Content); // There is no reason to congratulate individual members if the team closed // all of the work items! This also simplifies the code a little bit. if (messages.Any()) { messages.AddRange(greatPreviousIterationTask.Result.Content); } // Send the messages _retrospectiveMessageSender.SendMessages(messages).Wait(); // Clearing out and exiting. Context.Stop(Self); Sender.Tell(new AnalysisCompleteResponse()); }
private void StartAnalysis(StartAnalysisRequest request) { var firstDayOfSprint = _currentIterationInfoOptions.Value.StartDate.Date == DateTime.Now.Date; // There is another function that runs when it is the first day of the sprint! if (firstDayOfSprint) { Context.Stop(Self); Sender.Tell(new AnalysisCompleteResponse()); return; } var lastDayOfSprint = _currentIterationInfoOptions.Value.FinishDate.Date == DateTime.Now.Date; var currentIterationWorkItems = _workItemsRetriever.GetWorkItems(IterationTimeFrame.Current); var pendingPullRequests = _pullRequestsRetriever.GetPullRequests(); // Creating the subordinate actors. var estimateWorkItemActor = Context.ActorOf(Context.DI().Props <EstimateWorkItemsActor>(), "estimate-work-item-actor"); var descriptiveTitleActor = Context.ActorOf(Context.DI().Props <DescriptiveTitleActor>(), "descriptive-title-actor"); var activateWorkItemActor = Context.ActorOf(Context.DI().Props <ActivateWorkItemActor>(), "activate-work-item-actor"); var descriptionActor = Context.ActorOf(Context.DI().Props <DescriptionActor>(), "description-actor"); var longCodeCompleteActor = Context.ActorOf(Context.DI().Props <LongCodeCompleteActor>(), "long-code-complete-actor"); var greatWorkActor = Context.ActorOf(Context.DI().Props <GreatWorkActor>(), "great-work-actor"); var stillActiveWorkItemsActor = Context.ActorOf(Context.DI().Props <StillActiveWorkItemsActor>(), "still-active-work-items-actor"); var pendingPullRequestsActor = Context.ActorOf(Context.DI().Props <PendingPullRequestsActor>(), "pending-pull-requests-actor"); // Running the actors. var tasks = new List <Task>(); var estimateWorkItemTask = estimateWorkItemActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(estimateWorkItemTask); var descriptiveTitleTask = descriptiveTitleActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(descriptiveTitleTask); var activeWorkItemTask = activateWorkItemActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(activeWorkItemTask); var descriptionTask = descriptionActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(descriptionTask); var longCodeCompleteTask = longCodeCompleteActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(longCodeCompleteTask); var greatWorkTask = greatWorkActor .Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems); tasks.Add(greatWorkTask); var dummyStillActiveWorkItemsTask = new Task <ActorResponse <IReadOnlyList <string> > >( () => new ActorResponse <IReadOnlyList <string> >(new List <string>(), false)); dummyStillActiveWorkItemsTask.Start(); var stillActiveWorkItemsTask = lastDayOfSprint ? stillActiveWorkItemsActor.Ask <ActorResponse <IReadOnlyList <string> > >(currentIterationWorkItems) : dummyStillActiveWorkItemsTask; tasks.Add(stillActiveWorkItemsTask); var longPendingPullRequestsTask = pendingPullRequestsActor.Ask <ActorResponse <IReadOnlyList <string> > >(pendingPullRequests); tasks.Add(longPendingPullRequestsTask); // Waiting for all the of the actors to finish their work and return a response back. Task.WaitAll(tasks.ToArray()); // Collecting the results from each actor. var messages = new List <string>(); messages.AddRange(estimateWorkItemTask.Result.Content); messages.AddRange(descriptiveTitleTask.Result.Content); messages.AddRange(descriptionTask.Result.Content); messages.AddRange(activeWorkItemTask.Result.Content); messages.AddRange(stillActiveWorkItemsTask.Result.Content); messages.AddRange(longCodeCompleteTask.Result.Content); messages.AddRange(longPendingPullRequestsTask.Result.Content); // Sending "great work" message when there are no other messages makes the greeting a little awkward // as the greeting asks for completion some work items, but there is none. // todo Improve this as I still want to send the positive feedback even if there is nothing else. if (messages.Any()) { messages.AddRange(greatWorkTask.Result.Content); } // Sending the messages from each actor to the message senders. Using a different message sender if it // is the last day of the sprint. if (lastDayOfSprint) { _lastDayOfCurrentIterationMessageSender.SendMessages(messages).Wait(); } else { _currentIterationMessageSender.SendMessages(messages).Wait(); } Context.Stop(Self); // This is required for stopping the program. Check out the Ask<> calls in the function classes. Sender.Tell(new AnalysisCompleteResponse()); }