/// <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);
        }
Esempio n. 6
0
        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));
            }
        }
Esempio n. 7
0
 public SingleEmrActivityIterator(SwfActivity swfActivity)
 {
     this.emrActivity = SingleEmrActivityIterator.CreateStrategy(swfActivity);
 }