Esempio n. 1
0
        public void CancelWorkflow()
        {
            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 cancelRequest = new RequestCancelWorkflowExecutionRequest()
            {
                Domain     = DOMAIN,
                RunId      = runId,
                WorkflowId = workflowId
            };

            var cancelResponse = Client.RequestCancelWorkflowExecution(cancelRequest);

            Assert.IsNotNull(cancelResponse.ResponseMetadata.RequestId);
        }
Esempio n. 2
0
        public void FailedActivity()
        {
            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 respondFailedRequest = new RespondActivityTaskFailedRequest()
            {
                TaskToken = task.TaskToken,
                Details   = "fail task",
                Reason    = "result not required"
            };

            var respondFailedRespond = Client.RespondActivityTaskFailed(respondFailedRequest);

            Assert.IsNotNull(respondFailedRespond.ResponseMetadata.RequestId);
        }
Esempio n. 3
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.StartWorkflowExecutionAsync(startRequest).Result.Run.RunId;


            var task = startActivity(runId);

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

            var respondCompleteRespond = Client.RespondActivityTaskCompletedAsync(respondCompleteRequest).Result;

            Assert.IsNotNull(respondCompleteRespond.ResponseMetadata.RequestId);
        }
Esempio n. 4
0
        public void StartAndTerminateWorkflowExecution()
        {
            string domainName = "sdk-dotnet-start-" + DateTime.Now.Ticks;
            var    regRequest = new RegisterDomainRequest()
            {
                Name        = domainName,
                Description = "A Description",
                WorkflowExecutionRetentionPeriodInDays = "4"
            };

            Client.RegisterDomain(regRequest);
            try
            {
                var regWorkflowRequest = new RegisterWorkflowTypeRequest()
                {
                    Name        = "Start and Terminate Workflow",
                    Domain      = domainName,
                    Description = "Another Description",
                    Version     = "1.0",
                    DefaultExecutionStartToCloseTimeout = FIVE_HOUR_DURATION,
                    DefaultTaskStartToCloseTimeout      = FOUR_HOUR_DURATION
                };

                var regWorkflowResponse = Client.RegisterWorkflowType(regWorkflowRequest);
                try
                {
                    Sleep(); // Sleep for the eventual consistency
                    var workflowId   = DateTime.Now.Ticks.ToString();
                    var startRequest = new StartWorkflowExecutionRequest()
                    {
                        Domain      = domainName,
                        WorkflowId  = workflowId,
                        ChildPolicy = "TERMINATE",
                        TaskList    = new TaskList()
                        {
                            Name = "ImportantTasks"
                        },
                        WorkflowType = new WorkflowType()
                        {
                            Name = regWorkflowRequest.Name, Version = regWorkflowRequest.Version
                        }
                    };

                    var startResponse = Client.StartWorkflowExecution(startRequest);
                    Assert.IsNotNull(startResponse.Run.RunId);

                    Thread.Sleep(10 * 1000);
                    var countWorkRequest = new CountOpenWorkflowExecutionsRequest()
                    {
                        Domain          = domainName,
                        StartTimeFilter = new ExecutionTimeFilter()
                        {
                            OldestDate = DateTime.Now.AddDays(-4),
                            LatestDate = DateTime.Now.AddDays(1)
                        },
                        ExecutionFilter = new WorkflowExecutionFilter()
                        {
                            WorkflowId = workflowId
                        }
                    };

                    var countWorkResponse = Client.CountOpenWorkflowExecutions(countWorkRequest);

                    Assert.AreEqual(1, countWorkResponse.WorkflowExecutionCount.Count);

                    var listWorkRequest = new ListOpenWorkflowExecutionsRequest()
                    {
                        Domain          = domainName,
                        StartTimeFilter = new ExecutionTimeFilter()
                        {
                            OldestDate = DateTime.Now.AddDays(-4),
                            LatestDate = DateTime.Now.AddDays(1)
                        },
                        ExecutionFilter = new WorkflowExecutionFilter()
                        {
                            WorkflowId = workflowId
                        }
                    };

                    var listWorkResponse = Client.ListOpenWorkflowExecutions(listWorkRequest);
                    Assert.AreEqual(1, listWorkResponse.WorkflowExecutionInfos.ExecutionInfos.Count);

                    var info = listWorkResponse.WorkflowExecutionInfos.ExecutionInfos[0];
                    Assert.AreEqual(regWorkflowRequest.Name, info.WorkflowType.Name);
                    Assert.AreEqual(regWorkflowRequest.Version, info.WorkflowType.Version);
                    Assert.AreEqual(startResponse.Run.RunId, info.Execution.RunId);
                    Assert.AreEqual(startRequest.WorkflowId, info.Execution.WorkflowId);

                    var descRequest = new DescribeWorkflowExecutionRequest()
                    {
                        Domain    = domainName,
                        Execution = new WorkflowExecution()
                        {
                            RunId      = startResponse.Run.RunId,
                            WorkflowId = startRequest.WorkflowId
                        }
                    };

                    var descResponse = Client.DescribeWorkflowExecution(descRequest);

                    Assert.IsNotNull(descResponse.WorkflowExecutionDetail);
                    Assert.AreEqual(startRequest.TaskList.Name, descResponse.WorkflowExecutionDetail.ExecutionConfiguration.TaskList.Name);

                    var termRequest = new TerminateWorkflowExecutionRequest()
                    {
                        Domain      = domainName,
                        ChildPolicy = "TERMINATE",
                        WorkflowId  = workflowId
                    };

                    var termResponse = Client.TerminateWorkflowExecution(termRequest);
                    Assert.IsNotNull(termResponse.ResponseMetadata.RequestId);
                }
                finally
                {
                    Client.DeprecateWorkflowType(new DeprecateWorkflowTypeRequest()
                    {
                        Domain       = domainName,
                        WorkflowType = new WorkflowType()
                        {
                            Name    = "Start and Terminate Workflow",
                            Version = "1.0"
                        }
                    });
                }
            }
            finally
            {
                var depRequest = new DeprecateDomainRequest()
                {
                    Name = domainName
                };
                Client.DeprecateDomain(depRequest);
            }
        }
Esempio n. 5
0
        public void TestPollDecider()
        {
            string workflowId   = DateTime.Now.Ticks.ToString();
            var    startRequest = new StartWorkflowExecutionRequest()
            {
                Domain       = DOMAIN,
                WorkflowId   = workflowId,
                ChildPolicy  = "TERMINATE",
                TaskList     = TASKLIST,
                Input        = "ImportantKeyId",
                WorkflowType = WORKFLOW_TYPE
            };

            var startResponse = Client.StartWorkflowExecution(startRequest);


            var pollDeciderRequest = new PollForDecisionTaskRequest()
            {
                Domain   = DOMAIN,
                TaskList = TASKLIST,
                Identity = "testdecider"
            };

            var pollDeciderResponse = Client.PollForDecisionTask(pollDeciderRequest);

            Assert.IsNotNull(pollDeciderResponse.DecisionTask);
            Assert.IsTrue(pollDeciderResponse.DecisionTask.Events.Count > 0);
            Assert.IsNotNull(pollDeciderResponse.DecisionTask.Events[0].EventId);
            Assert.IsNotNull(pollDeciderResponse.DecisionTask.Events[0].EventType);
            Assert.AreEqual(DateTime.Today, pollDeciderResponse.DecisionTask.Events[0].EventTimestamp.ToLocalTime().Date);

            var task           = pollDeciderResponse.DecisionTask;
            var respondRequest = new RespondDecisionTaskCompletedRequest()
            {
                TaskToken = task.TaskToken,
                Decisions = new List <Decision>()
                {
                    new Decision()
                    {
                        DecisionType = "ScheduleActivityTask",
                        ScheduleActivityTaskDecisionAttributes = new ScheduleActivityTaskDecisionAttributes()
                        {
                            ActivityType = ACTIVITY_TYPE,
                            ActivityId   = DateTime.Now.Ticks.ToString(),
                            TaskList     = TASKLIST
                        }
                    }
                }
            };

            Client.RespondDecisionTaskCompleted(respondRequest);

            var pollActivityRequest = new PollForActivityTaskRequest()
            {
                Domain   = DOMAIN,
                TaskList = TASKLIST,
                Identity = "testactivity"
            };

            var pollActivityResponse = Client.PollForActivityTask(pollActivityRequest);

            Assert.IsNotNull(pollActivityResponse.ResponseMetadata.RequestId);
            Assert.AreEqual(ACTIVITY_TYPE.Name, pollActivityResponse.ActivityTask.ActivityType.Name);
            Assert.AreEqual(ACTIVITY_TYPE.Version, pollActivityResponse.ActivityTask.ActivityType.Version);


            var signalRequest = new SignalWorkflowExecutionRequest()
            {
                Domain     = DOMAIN,
                RunId      = startResponse.Run.RunId,
                WorkflowId = startRequest.WorkflowId,
                SignalName = "TestSignal"
            };

            var signalResponse = Client.SignalWorkflowExecution(signalRequest);

            Assert.IsNotNull(signalResponse.ResponseMetadata.RequestId);
        }
Esempio n. 6
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);
        }