/// <summary> /// Process activity task /// </summary> /// <param name="input">Input for the activity task</param> /// <returns>Processing result: either an updated SWF activity, or an error message</returns> private async Task <ProcessSwfActivityResult> ProcessTask(string input) { ProcessSwfActivityResult result = new ProcessSwfActivityResult(); try { //read SWF activity info SwfActivity swfActivity = JsonSerializer.Deserialize <SwfActivity>(input); //based on SWF activity's info create an EMR activity SingleEmrActivityIterator singleEmrActivityIterator = new SingleEmrActivityIterator(swfActivity); //Run this activity on EMR Service using (EmrActivitiesRunner emrRunner = new EmrActivitiesRunner(this.EmrJobLogger, this.EmrJobStateChecker, this.EmrClient, this.Settings, singleEmrActivityIterator)) { emrRunner.JobFlowId = swfActivity.JobFlowId; //set JobFlowId for the current activity bool emrJobOk = await emrRunner.Start(); if (emrJobOk) { swfActivity.JobFlowId = emrRunner.JobFlowId; //read JobFlowId in case it was changed (for example, during starting a new EMR job) result.Output = swfActivity; } else { result.ErrorMessage = emrRunner.ErrorMessage; } } } catch (Exception ex) { result.ErrorMessage = ex.Message; } return(result); }
private List <Decision> Decide(DecisionTask task) { List <Decision> decisions = new List <Decision>(); SwfActivity latestActivity = null; HistoryEvent latestEvent = task.Events[0]; if (latestEvent.EventType == EventType.ActivityTaskCompleted) { latestActivity = JsonSerializer.Deserialize <SwfActivity>(latestEvent.ActivityTaskCompletedEventAttributes.Result); } SwfActivity nextActivity = this.CreateNextEmrActivity(latestActivity); if (nextActivity == null) { decisions.Add(this.CreateCompleteWorkflowExecutionDecision()); } else { decisions.Add(this.CreateActivityDecision(nextActivity)); } return(decisions); }
private SwfActivity CreateNextEmrActivity(SwfActivity previousActivity) { if (previousActivity == null) { return(new SwfActivity() { Name = "startCluster", Type = EmrActivityType.StartJob }); } switch (previousActivity.Name) { case "startCluster": return(new SwfActivity() { Name = "runSteps", JobFlowId = previousActivity.JobFlowId, Type = EmrActivityType.AddSteps }); case "runSteps": return(new SwfActivity() { Name = "terminateCluster", JobFlowId = previousActivity.JobFlowId, Type = EmrActivityType.TerminateJob }); } return(null); }
private async Task CompleteTask(String taskToken, SwfActivity swfActivity) { RespondActivityTaskCompletedRequest request = new RespondActivityTaskCompletedRequest() { Result = JsonSerializer.Serialize <SwfActivity>(swfActivity), TaskToken = taskToken }; RespondActivityTaskCompletedResponse response = await this.SwfClient.RespondActivityTaskCompletedAsync(request); this.EmrJobLogger.PrintInfo(string.Format(SwfResources.Info_ActivityCompletedTemplate, swfActivity.Name, swfActivity.JobFlowId)); }
private Decision CreateActivityDecision(SwfActivity nextActivity) { Decision decision = new Decision() { DecisionType = DecisionType.ScheduleActivityTask, ScheduleActivityTaskDecisionAttributes = new ScheduleActivityTaskDecisionAttributes() { ActivityType = new ActivityType() { Name = this.SwfConfiguration.ActivityName, Version = this.SwfConfiguration.ActivityVersion }, ActivityId = this.SwfConfiguration.ActivityIdPrefix + DateTime.Now.TimeOfDay, Input = JsonSerializer.Serialize <SwfActivity>(nextActivity) } }; this.EmrJobLogger.PrintAddingNewActivity(nextActivity.Name); return(decision); }
private static EmrActivity CreateStrategy(SwfActivity swfActivity) { XmlDocument xml = new XmlDocument(); xml.Load(swfActivity.Path); switch (swfActivity.Type) { case EmrActivityType.StartJob: return(new StartJobActivity(swfActivity.Name, xml)); case EmrActivityType.AddSteps: return(new AddStepsActivity(swfActivity.Name, xml)); case EmrActivityType.TerminateJob: return(new TerminateJobActivity(swfActivity.Name)); default: throw new InvalidOperationException(string.Format(SwfResources.E_UnsupportedEmrActivityTypeTemplate, swfActivity.Type)); } }
public SingleEmrActivityIterator(SwfActivity swfActivity) { this.emrActivity = SingleEmrActivityIterator.CreateStrategy(swfActivity); }