public void Decider() { int activityCount = 0; while (true) { Console.WriteLine("Decider: Polling for decision task ..."); PollForDecisionTaskRequest request = new PollForDecisionTaskRequest() { Domain = domainName, TaskList = new TaskList() { Name = deciderPollingKey } }; PollForDecisionTaskResponse response = swfClient.PollForDecisionTaskAsync(request).Result; if (response.DecisionTask.TaskToken == null) { Console.WriteLine("Decider: NULL"); continue; } int completedActivityTaskCount = 0, totalActivityTaskCount = 0; foreach (HistoryEvent e in response.DecisionTask.Events) { Console.WriteLine("Decider: EventType - " + e.EventType + ", EventId - " + e.EventId); if (e.EventType == "ActivityTaskCompleted") { completedActivityTaskCount++; } if (e.EventType.Value.StartsWith("Activity")) { totalActivityTaskCount++; } } Console.WriteLine(".... completedCount=" + completedActivityTaskCount); List <Decision> decisions = new List <Decision>(); if (totalActivityTaskCount == 0) { ScheduleActivity("Activity1", decisions); activityCount = 4; } else if (completedActivityTaskCount == activityCount) { Decision decision = new Decision() { DecisionType = DecisionType.CompleteWorkflowExecution, CompleteWorkflowExecutionDecisionAttributes = new CompleteWorkflowExecutionDecisionAttributes { Result = "{\"Result\":\"WF Complete!\"}" } }; decisions.Add(decision); Console.WriteLine("Worflow Complete"); } RespondDecisionTaskCompletedRequest respondDecisionTaskCompletedRequest = new RespondDecisionTaskCompletedRequest() { Decisions = decisions, TaskToken = response.DecisionTask.TaskToken }; swfClient.RespondDecisionTaskCompletedAsync(respondDecisionTaskCompletedRequest); } }
private async Task <string> CallLambdaAsync(string functionName, object input, string id) { var result = string.Empty; Activity activity = null; var workflowContext = await GetCurrentContext(); if (workflowContext != null && workflowContext.Status == Status.STARTED) { var status = GetStatus(Model.ActivityType.Task, functionName, id, workflowContext); if (status == Status.NONE) { var decisionRequest = new RespondDecisionTaskCompletedRequest { TaskToken = workflowContext.ReferenceToken, Decisions = new List <Decision> { new Decision { DecisionType = DecisionType.ScheduleLambdaFunction, ScheduleLambdaFunctionDecisionAttributes = new ScheduleLambdaFunctionDecisionAttributes { Input = JsonConvert.SerializeObject(input), Name = functionName, Id = id, Control = id } } } }; await _amazonSimpleWorkflowClient.RespondDecisionTaskCompletedAsync(decisionRequest); } else { await SetMarker(Model.ActivityType.Task, functionName, id, status, workflowContext.ReferenceToken); await RaiseEventAsync(Constants.LAMBDA_BIZ_EVENT, _orchestrationId, Constants.LAMBDA_BIZ_EVENT); activity = FindActivity(Model.ActivityType.Task, id, functionName, workflowContext.Activities); } if (status == Status.NONE || status == Status.SCHEDULED || status == Status.STARTED) { var waitStatus = Status.NONE; Workflow workflowWaitContext = null; do { workflowWaitContext = await GetCurrentContext(); waitStatus = GetStatus(Model.ActivityType.Task, functionName, id, workflowWaitContext); await SetMarker(Model.ActivityType.Task, functionName, id, waitStatus, workflowWaitContext.ReferenceToken); await RaiseEventAsync(Constants.LAMBDA_BIZ_EVENT, _orchestrationId, Constants.LAMBDA_BIZ_EVENT); }while (waitStatus != Status.SUCCEEDED && waitStatus != Status.FAILED && waitStatus != Status.TIMEOUT); activity = FindActivity(Model.ActivityType.Task, id, functionName, workflowWaitContext.Activities); } } if (activity.Status == Status.FAILED) { throw new Exception(activity.FailureDetails); } if (activity.Status == Status.TIMEOUT) { throw new Exception("Time-Out"); } result = activity.Result; return(result); }