Exemplo n.º 1
0
        public void CompleteActivity()
        {
            var workflowId   = DateTime.Now.Ticks.ToString();
            var startRequest = new StartWorkflowExecutionRequest()
            {
                Domain       = DOMAIN,
                WorkflowId   = workflowId,
                ChildPolicy  = "TERMINATE",
                TaskList     = TASKLIST,
                Input        = "ImportantKeyId",
                WorkflowType = WORKFLOW_TYPE
            };

            var runId = Client.StartWorkflowExecution(startRequest).Run.RunId;


            var task = startActivity(runId);

            var respondCompleteRequest = new RespondActivityTaskCompletedRequest()
            {
                TaskToken = task.TaskToken,
                Result    = "completed"
            };

            var respondCompleteRespond = Client.RespondActivityTaskCompleted(respondCompleteRequest);

            Assert.IsNotNull(respondCompleteRespond.ResponseMetadata.RequestId);
        }
Exemplo n.º 2
0
 public override async Task SendAsync(IAmazonSimpleWorkflow simpleWorkflow, CancellationToken cancellationToken)
 {
     var request = new RespondActivityTaskCompletedRequest()
     {
         Result = _result, TaskToken = _taskToken
     };
     await simpleWorkflow.RespondActivityTaskCompletedAsync(request, cancellationToken);
 }
Exemplo n.º 3
0
 /// <summary>
 /// Respond back to SWF that the activity task is complete
 /// </summary>
 /// <param name="taskToken"></param>
 /// <param name="activityState"></param>
 private void TaskCompleted(string taskToken, string result)
 {
     RespondActivityTaskCompletedRequest request = new RespondActivityTaskCompletedRequest
     {
         Result    = result,
         TaskToken = taskToken
     };
     RespondActivityTaskCompletedResponse response = _swfClient.RespondActivityTaskCompletedAsync(request).Result;
 }
Exemplo n.º 4
0
        protected override async Task SucceedActivityAsync(string taskToken, string result)
        {
            var activityCompletedRequest = new RespondActivityTaskCompletedRequest
            {
                TaskToken = taskToken,
                Result    = result
            };

            await _amazonSimpleWorkflowClient.RespondActivityTaskCompletedAsync(activityCompletedRequest);
        }
        async void CompleteTaskAsync(String taskToken)
        {
            RespondActivityTaskCompletedRequest request = new RespondActivityTaskCompletedRequest()
            {
                TaskToken = taskToken
            };
            RespondActivityTaskCompletedResponse response = await this._swfClient.RespondActivityTaskCompletedAsync(request);

            Logger.LogMessage("{0} Activity task completed.", this.ActivityType);
        }
        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));
        }
Exemplo n.º 7
0
Arquivo: Program.cs Projeto: wse/AWS
        static void Worker(string tasklistName)
        {
            string prefix = string.Format("WORKER {0}:{1:x} ", tasklistName,
                                          System.Threading.Thread.CurrentThread.ManagedThreadId);

            while (true)
            {
                Console.WriteLine($"{prefix} : Polling for activity task ...");
                var pollForActivityTaskRequest =
                    new PollForActivityTaskRequest()
                {
                    Domain   = domainName,
                    TaskList = new TaskList()
                    {
                        // Poll only the tasks assigned to me
                        Name = tasklistName
                    }
                };

                var pollForActivityTaskResponse =
                    SwfClient.PollForActivityTask(pollForActivityTaskRequest);

                if (pollForActivityTaskResponse.ActivityTask.ActivityId == null)
                {
                    Console.WriteLine($"{prefix} : NULL");
                }
                else
                {
                    Console.WriteLine($"{prefix} : saw Input {pollForActivityTaskResponse.ActivityTask.Input}");

                    var respondActivityTaskCompletedRequest = new RespondActivityTaskCompletedRequest()
                    {
                        Result    = "{\"activityResult1\":\"Result Value1\"}",
                        TaskToken = pollForActivityTaskResponse.ActivityTask.TaskToken
                    };

                    var respondActivityTaskCompletedResponse =
                        SwfClient.RespondActivityTaskCompleted(respondActivityTaskCompletedRequest);
                    Console.WriteLine($"{prefix} : Activity task completed. ActivityId - " +
                                      pollForActivityTaskResponse.ActivityTask.ActivityId);
                }
            }
        }
Exemplo n.º 8
0
        public static void Worker(IAmazonSimpleWorkflow swfClient, string domainName, string tasklistName)
        {
            string prefix = string.Format("Worker{0}:{1:x} ", tasklistName,
                                          System.Threading.Thread.CurrentThread.ManagedThreadId);

            while (true)
            {
                Console.WriteLine(prefix + ": Polling for activity task ...");
                PollForActivityTaskRequest pollForActivityTaskRequest =
                    new PollForActivityTaskRequest()
                {
                    Domain   = domainName,
                    TaskList = new TaskList()
                    {
                        // Poll only the tasks assigned to me
                        Name = tasklistName
                    }
                };
                PollForActivityTaskResponse pollForActivityTaskResponse =
                    swfClient.PollForActivityTask(pollForActivityTaskRequest);

                RespondActivityTaskCompletedRequest respondActivityTaskCompletedRequest =
                    new RespondActivityTaskCompletedRequest()
                {
                    Result    = "{\"activityResult1\":\"Result Value1\"}",
                    TaskToken = pollForActivityTaskResponse.ActivityTask.TaskToken
                };
                if (pollForActivityTaskResponse.ActivityTask.ActivityId == null)
                {
                    Console.WriteLine(prefix + ": NULL");
                }
                else
                {
                    RespondActivityTaskCompletedResponse respondActivityTaskCompletedResponse =
                        swfClient.RespondActivityTaskCompleted(respondActivityTaskCompletedRequest);
                    Console.WriteLine(prefix + ": Activity task completed. ActivityId - " +
                                      pollForActivityTaskResponse.ActivityTask.ActivityId);
                }
            }
        }
Exemplo n.º 9
0
 public void Worker(string tasklistName)
 {
     while (true)
     {
         Console.WriteLine("Starting Worker" + tasklistName + ": Polling for activity...");
         PollForActivityTaskRequest pollForActivityTaskRequest =
             new PollForActivityTaskRequest()
         {
             Domain   = domainName,
             TaskList = new TaskList()
             {
                 Name = tasklistName
             }
         };
         PollForActivityTaskResponse pollForActivityTaskResponse = swfClient.PollForActivityTaskAsync(pollForActivityTaskRequest).Result;
         Console.WriteLine("finished polling pollForActivityTaskResponse");
         RespondActivityTaskCompletedRequest respondActivityTaskCompletedRequest =
             //Ideally this function would actually do something and return real values. But since it's just hello
             //world we're returning nothing of value. (a static string)
             new RespondActivityTaskCompletedRequest()
         {
             Result    = "{\"customReturnValue\":\"CustomReturnResult\"}",
             TaskToken = pollForActivityTaskResponse.ActivityTask.TaskToken
         };
         if (pollForActivityTaskResponse.ActivityTask.ActivityId == null)
         {
             Console.WriteLine("Starting Worker" + tasklistName + ": NULL");
         }
         else
         {
             RespondActivityTaskCompletedResponse respondActivityTaskCompletedResponse =
                 swfClient.RespondActivityTaskCompletedAsync(respondActivityTaskCompletedRequest).Result;
             Console.WriteLine("Starting Worker" + tasklistName + ": Activity completed" + pollForActivityTaskResponse.ActivityTask.ActivityId);
         }
     }
 }
Exemplo n.º 10
0
        public static void Main(string[] args)
        {
            // Define the workflows that we know of that event processor will be handling
            var workflows = new Dictionary <string, Type>
            {
                { "CustomerOrderWorkflow", typeof(CustomerOrderWorkflow) },
                { "VerifyCustomerWorkflow", typeof(VerifyCustomerWorkflow) }
            };


            // Stopwatch to see how well we are performing
            var stopwatch = new Stopwatch();

            // We will use this ID as our decision task ID and activity task ID to identify ourselves when polling for
            // decision and activity tasks.
            var workflowWorkerIdentity = Guid.NewGuid();

            // Print out our AWS SWF domains, workflows and activities
            Console.Write(GetServiceOutput());

            var loop = true;

            do
            {
                // Our super simple application menu
                Console.WriteLine("");
                Console.WriteLine("=============");
                Console.WriteLine("| Main Menu |");
                Console.WriteLine("=============");
                Console.WriteLine("[1] Submit a new workflow");
                Console.WriteLine("[2] Wait for decide using a decision task");
                Console.WriteLine("[3] Wait for and do some work for an activity task");
                Console.WriteLine("[4] Quit");

                Console.Write("\nChoice: ");
                var key = Console.ReadLine();

                if (String.IsNullOrEmpty(key))
                {
                    continue;
                }

                switch (key)
                {
                // Initiate a workflow execution
                case "1":
                {
                    Console.WriteLine("Option [1] selected - Submit a new workflow");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        // Our simple property bag: we just need to the email for the account
                        var propertyBag = new Dictionary <string, object> {
                            { "SampleOrderNumber", "12345" }
                        };

                        // Setup the workflow request
                        var workflowRequest = new StartWorkflowExecutionRequest
                        {
                            Domain       = "demo-domain",
                            WorkflowId   = Guid.NewGuid().ToString(),
                            WorkflowType = new WorkflowType
                            {
                                Name    = "CustomerOrderWorkflow",
                                Version = "1.0"
                            },
                            Input = JsonConvert.SerializeObject(propertyBag)
                        };

                        try
                        {
                            // Call AWS SWF and submit the workflow request
                            swfClient.StartWorkflowExecution(workflowRequest);
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                // Poll for decision task
                case "2":
                {
                    Console.WriteLine("Option [2] selected - Wait for decide using a decision task");
                    Console.WriteLine("Waiting...");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        try
                        {
                            // Setup the decision request
                            var decisionTaskRequest = new PollForDecisionTaskRequest
                            {
                                Domain   = "demo-domain",
                                Identity = workflowWorkerIdentity.ToString(),
                                TaskList = new TaskList {
                                    Name = "DeciderTaskList-Default"
                                }
                            };

                            // Call AWS SWF and wait for (default timeout: 60 secs) a decision task
                            var decisionTaskResponse = swfClient.PollForDecisionTask(decisionTaskRequest);

                            // Task token being an empty string means there are no tasks available and
                            // we are past the 60 seconds that AWS holds a connection in case a task
                            // becomes available. If this is the case, we simply retry.
                            var taskToken =
                                decisionTaskResponse.DecisionTask.TaskToken;
                            if (!String.IsNullOrEmpty(taskToken))
                            {
                                // We have a valid task, do something...
                                var decisionTask =
                                    decisionTaskResponse.DecisionTask;

                                switch (decisionTask.WorkflowType.Name)
                                {
                                case "CustomerOrderWorkflow":
                                case "VerifyCustomerWorkflow":
                                {
                                    Debug.Assert(decisionTask.WorkflowType.Version == "1.0");
                                }
                                break;

                                default:
                                    Console.WriteLine("ERROR: Unknown workflow.");
                                    break;
                                }

                                // Define a new WorkflowEventsProcessor object and let it make the decision!
                                stopwatch.Start();
                                var workflowProcessor = new WorkflowEventsProcessor(decisionTask, workflows, decisionTaskRequest, swfClient);
                                var decisionRequest   = workflowProcessor.Decide();
                                stopwatch.Stop();

                                Console.WriteLine(">>> Decision(s) made in " + stopwatch.ElapsedMilliseconds + "ms");

                                // We have our decision, send it away and do something
                                // more productive with the response
                                swfClient.RespondDecisionTaskCompleted(decisionRequest);
                            }
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                // Poll for activity task
                case "3":
                {
                    Console.WriteLine("Option [3] selected - Wait for decide using a activity task");
                    Console.WriteLine("Waiting...");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        try
                        {
                            // Setup the activity request
                            var activityTaskRequest = new PollForActivityTaskRequest
                            {
                                Domain   = "demo-domain",
                                Identity = workflowWorkerIdentity.ToString(),
                                TaskList = new TaskList {
                                    Name = "ActivityTaskList-Default"
                                }
                            };

                            // Call AWS SWF and wait for (default timeout: 60 secs) a activity task
                            var activityTaskResponse = swfClient.PollForActivityTask(activityTaskRequest);

                            // Task token being an empty string means there are no tasks available and
                            // we are past the 60 seconds that AWS holds a connection in case a task
                            // becomes available. If this is the case, we simply retry.
                            var taskToken =
                                activityTaskResponse.ActivityTask.TaskToken;
                            if (!String.IsNullOrEmpty(taskToken))
                            {
                                // We have a valid task, do something...
                                var activityTask =
                                    activityTaskResponse.ActivityTask;

                                Console.WriteLine("\n");
                                Console.WriteLine(">>> Activity: " + activityTask.ActivityType.Name);

                                // In the real world we would define the activity code in a separate object
                                // and fire off a thread to actually work on it but in this case we are just
                                // testing the workflow so this suffices
                                switch (activityTask.ActivityType.Name)
                                {
                                // CustomerOrderWorkflow activities
                                case "VerifyOrder":
                                case "ShipOrder":
                                {
                                    Debug.Assert(activityTask.ActivityType.Version == "1.0");
                                }
                                break;

                                // VerifyCustomerWorkflow activities
                                case "VerifyCustomerAddress":
                                case "CheckFraudDB":
                                case "ChargeCreditCard":
                                {
                                    Debug.Assert(activityTask.ActivityType.Version == "1.0");
                                }
                                break;

                                default:
                                    Console.WriteLine("ERROR: Unknown activity.");
                                    break;
                                }

                                var activityCompletedRequest = new RespondActivityTaskCompletedRequest
                                {
                                    TaskToken = activityTask.TaskToken,
                                    Result    = activityTask.Input
                                };

                                // Completion request setup complete, send it away. NOTE: Do something more
                                // productive with the response
                                swfClient.RespondActivityTaskCompleted(activityCompletedRequest);

                                //var activityFailedRequest = new RespondActivityTaskFailedRequest
                                //    {
                                //        TaskToken = activityTask.TaskToken,
                                //        Details = "Test failure."
                                //    };
                                //// Completion request setup complete, send it away. NOTE: Do something more
                                //// productive with the response
                                //swfClient.RespondActivityTaskFailed(activityFailedRequest);
                            }
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                case "4":
                    // Quit
                    loop = false;
                    break;

                default:
                    Console.WriteLine("ERROR: Unknown command.");
                    break;
                }
            } while (loop);
        }