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); }
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); }
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); }
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); } }
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); }
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); }