/// <summary> /// Helper method to create a decision for scheduling an activity /// </summary> /// <returns>Decision with ScheduleActivityTaskDecisionAttributes</returns> Decision CreateActivityDecision(Common.WorkflowExecutionStartedInput startingInput, int RequestActionId) { // setup the input for the activity task. Common.ActivityTaskCompletedResult state = new Common.ActivityTaskCompletedResult { StartingInput = startingInput, RequestActionId = RequestActionId }; Decision decision = new Decision() { DecisionType = DecisionType.ScheduleActivityTask, ScheduleActivityTaskDecisionAttributes = new ScheduleActivityTaskDecisionAttributes() { ActivityType = new Amazon.SimpleWorkflow.Model.ActivityType() { Name = "MinimalWorkflowActivityType1", Version = "5.0" }, ActivityId = "MinimalWorkflowActivityType1" + DateTime.Now.TimeOfDay, Input = Common.Utils.SerializeToJSON<Common.ActivityTaskCompletedResult>(state) } }; Console.WriteLine(string.Format("Decision: Schedule Activity Task (RequestId {0} to RequestActionId {1})", state.StartingInput.RequestId, RequestActionId)); return decision; }
List<Decision> DecideHelper(Common.WorkflowExecutionStartedInput startingInput, List<Common.ActivityTaskCompletedResult> activityStates) { List<Decision> decisions = new List<Decision>(); //the request should have a new state and actions... Request RequestCurrent = _tracker.GetRequestWithActions(startingInput.RequestId); IEnumerable<RequestAction> ActiveNotComplete = RequestCurrent.RequestActions.Where(x => (x.ActionTypeId == Common.Constants.AWSActivityTypeId || x.ActionTypeId == 2) && x.IsActive && !x.IsComplete); //if a request action was found that was "active" but not "complete" it must be run now if (ActiveNotComplete.Count() != 0) { //iterate through the active but not complete actions... foreach (RequestAction ra in ActiveNotComplete) { if (ra.ActionTypeId == 1) //if state completed... { //code to tell SWF to fire activity for the new state decisions.Add(CreateActivityDecision(startingInput, ra.RequestActionId ?? 0)); } if (ra.ActionTypeId == 2) //if timer { // setup the input for the activity task. Common.ActivityTaskCompletedResult state = new Common.ActivityTaskCompletedResult { StartingInput = startingInput, RequestActionId = ra.RequestActionId ?? 0 }; Decision decision = new Decision() { DecisionType = DecisionType.StartTimer, StartTimerDecisionAttributes = new StartTimerDecisionAttributes() { Control = Common.Utils.SerializeToJSON<Common.ActivityTaskCompletedResult>(state), StartToFireTimeout = "3", TimerId = DateTime.Now.Ticks.ToString() } }; decisions.Add(decision); } } } else { Console.WriteLine("Workflow execution complete for " + startingInput.RequestId); //code to tell SWF to complete workflow execution decisions.Add(CreateCompleteWorkflowExecutionDecision(activityStates)); } return decisions; }