示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }