public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems) { AmazonSimpleWorkflowConfig config = new AmazonSimpleWorkflowConfig(); config.RegionEndpoint = region; ConfigureClient(config); AmazonSimpleWorkflowClient client = new AmazonSimpleWorkflowClient(creds, config); ActivityTypeInfos resp = new ActivityTypeInfos(); do { ListActivityTypesRequest req = new ListActivityTypesRequest { NextPageToken = resp.NextPageToken , MaximumPageSize = maxItems }; resp = client.ListActivityTypes(req); CheckError(resp.HttpStatusCode, "200"); foreach (var obj in resp.TypeInfos) { AddObject(obj); } }while (!string.IsNullOrEmpty(resp.NextPageToken)); }
private static async Task MainAsync(string[] args) { var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("provide key", "provide secret key"), RegionEndpoint.EUWest2); var domain = new Domain("GuflowTestDomain", client); await domain.RegisterAsync(10, "test guflow"); await domain.RegisterWorkflowAsync <ExpenseWorkflow>(); await domain.RegisterWorkflowAsync <ExpenseWorkflowWithTimeout>(); await domain.RegisterWorkflowAsync <PromotionWorkflow>(); await domain.RegisterWorkflowAsync <PromotionWorkflowWithTimeout>(); await domain.RegisterWorkflowAsync <PermitIssueWorkflow>(); await domain.RegisterWorkflowAsync <PermitIssueWorkflowWithTimeout>(); await domain.RegisterWorkflowAsync <UserActivateWorkflow>(); await domain.RegisterWorkflowAsync <UserActivateWorkflowWithTimeout>(); using (var workflowHost = domain.Host(new Workflow[] { new ExpenseWorkflow(), new ExpenseWorkflowWithTimeout(), new PromotionWorkflow(), new PromotionWorkflowWithTimeout(), new PermitIssueWorkflow(), new PermitIssueWorkflowWithTimeout(), new UserActivateWorkflow(), new UserActivateWorkflowWithTimeout() })) { workflowHost.OnError(e => { Console.WriteLine(e.Exception); return(ErrorAction.Continue); }); workflowHost.StartExecution(); Console.WriteLine("Press a key to terminate"); Console.ReadKey(); } }
public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems) { AmazonSimpleWorkflowConfig config = new AmazonSimpleWorkflowConfig(); config.RegionEndpoint = region; ConfigureClient(config); AmazonSimpleWorkflowClient client = new AmazonSimpleWorkflowClient(creds, config); DecisionTask resp = new DecisionTask(); do { PollForDecisionTaskRequest req = new PollForDecisionTaskRequest { NextPageToken = resp.NextPageToken , MaximumPageSize = maxItems }; resp = client.PollForDecisionTask(req); CheckError(resp.HttpStatusCode, "200"); foreach (var obj in resp.Events) { AddObject(obj); } }while (!string.IsNullOrEmpty(resp.NextPageToken)); }
private static async Task MainAsync(string[] args) { var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("access key", "secret key"), RegionEndpoint.EUWest2); var domain = new Domain("GuflowTestDomain", client); await domain.RegisterAsync(10, "test guflow"); await domain.RegisterWorkflowAsync <ParentWorkflow>(); await domain.RegisterWorkflowAsync <KidPlayWorkflow>(); var activities = new[] { typeof(PlayOnSwing), typeof(PlayOnZipWire) }; foreach (var activity in activities) { await domain.RegisterActivityAsync(activity); } using (var workflowHost = domain.Host(new Workflow[] { new ParentWorkflow(), new KidPlayWorkflow() })) using (var activityHost = domain.Host(activities)) { workflowHost.OnError(e => { Console.WriteLine(e.Exception); return(ErrorAction.Continue); }); workflowHost.StartExecution(); activityHost.StartExecution(); Console.WriteLine("Press a key to terminate"); Console.ReadKey(); } }
internal AWSOrchestration(AmazonSimpleWorkflowClient amazonSimpleWorkflowClient, string orchestrationId, IPersistantStore store, string lambdaRole) { _amazonSimpleWorkflowClient = amazonSimpleWorkflowClient; _orchestrationId = orchestrationId; _store = store; _lambdaRole = lambdaRole; }
private static async Task MainAsync(string[] args) { var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("access key", "secret key"), RegionEndpoint.EUWest2); var domain = new Domain("GuflowTestDomain", client); await domain.RegisterWorkflowAsync <DriverWorkflow>(); await domain.RegisterWorkflowAsync <LogProcessWorkflow>(); var activityTypes = new[] { typeof(DownloadLogActivity), typeof(UpdateMetricesActivity) }; foreach (var activityType in activityTypes) { await domain.RegisterActivityAsync(activityType); } using (var activitiHost = domain.Host(activityTypes)) using (var driverWorkflowHost = domain.Host(new[] { new DriverWorkflow() })) using (var workflowHost = domain.Host(new[] { new LogProcessWorkflow() })) { activitiHost.StartExecution(); var taskList = new TaskList("tasklist"); taskList.ReadStrategy = TaskList.ReadFirstPage; driverWorkflowHost.StartExecution(taskList); workflowHost.StartExecution(); Console.WriteLine("Press any key to terminate"); Console.ReadKey(); } }
private static async Task MainAsync(string[] args) { var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("secrete id", "secret"), RegionEndpoint.EUWest2); var domain = new Domain("GuflowTestDomain", client); await domain.RegisterAsync(10, "test guflow"); await domain.RegisterWorkflowAsync <BookingWorkflow>(); var activities = new[] { typeof(BookFlight), typeof(BookHotel), typeof(ChooseFlightMeal), typeof(BookDinner), typeof(SendConfirmation) }; foreach (var activity in activities) { await domain.RegisterActivityAsync(activity); } using (var activityHost = domain.Host(activities)) using (var workflowHost = domain.Host(new [] { new BookingWorkflow() })) { activityHost.StartExecution(); workflowHost.StartExecution(); Console.WriteLine("Press a key to terminate"); Console.ReadKey(); } }
public AWSOrchestrationFactory(bool usePersistantStore, string lambdaRole) { _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient(); _lambdaRole = lambdaRole; if (usePersistantStore) { _store = new AWSPeristantStore( ); } }
public AWSOrchestrationFactory(string awsAccessKey, string awsSecretAccessKey, string awsRegion, bool usePersistantStore, string lambdaRole) { _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient(awsAccessKey, awsSecretAccessKey, RegionEndpoint.GetBySystemName(awsRegion)); _lambdaRole = lambdaRole; if (usePersistantStore) { _store = new AWSPeristantStore(awsAccessKey, awsSecretAccessKey, awsRegion); } }
private static void StartEchoWorkflow() { var client = new AmazonSimpleWorkflowClient(); var activity = WorkflowFactory.CreateActivity <string, string>("echo", Echo, 60, 10, 10, 20) .Complete(); var workflow = WorkflowFactory.CreateWorkflow("theburningmonk.com", "echo_cs", "1") .Attach(activity) .Complete(); workflow.Start(client); }
protected IAmazonSimpleWorkflow CreateClient(AWSCredentials credentials, RegionEndpoint region) { var config = new AmazonSimpleWorkflowConfig { RegionEndpoint = region }; Amazon.PowerShell.Utils.Common.PopulateConfig(this, config); this.CustomizeClientConfig(config); var client = new AmazonSimpleWorkflowClient(credentials, config); client.BeforeRequestEvent += RequestEventHandler; client.AfterResponseEvent += ResponseEventHandler; return(client); }
public async Task <bool> Run() { //Create dependencies var settings = this.CreateSettings(); var emrJobLogger = new EmrJobLogger(); var emrJobStateChecker = new EmrJobStateChecker(); var emrClient = new AmazonElasticMapReduceClient(AccessKey, SecretKey, RegionEndpoint.USEast1); var swfClient = new AmazonSimpleWorkflowClient(AccessKey, SecretKey, RegionEndpoint.USEast1); var swfConfig = new DemoSwfConfiguration(); SwfManager swfManager = new SwfManager(emrJobLogger, swfClient, swfConfig); await swfManager.SetupAsync(); using (var decider = new SwfEmrJobDecider(emrJobLogger, swfClient, swfConfig)) using (var runner = new SwfActivitiesRunner(emrJobLogger, emrJobStateChecker, settings, emrClient, swfClient, swfConfig)) { //decider.Start } return(true); }
private static void StartCountHtmlElementsWorkflow() { var client = new AmazonSimpleWorkflowClient(); var echo = WorkflowFactory.CreateActivity <string, string>("echo", Echo, 60, 10, 10, 20) .Complete(); var countDiv = WorkflowFactory.CreateActivity <string, int>("count_divs", address => CountMatches("<div", address), 60, 10, 10, 20) .WithDescription("count the number of <div> elements") .Complete(); var countScripts = WorkflowFactory.CreateActivity <string, int>("count_scripts", address => CountMatches("<script", address), 60, 10, 10, 20) .WithDescription("count the number of <script> elements") .Complete(); var countSpans = WorkflowFactory.CreateActivity <string, int>("count_spans", address => CountMatches("<span", address), 60, 10, 10, 20) .WithDescription("count the number of <span> elements") .Complete(); var workflow = WorkflowFactory.CreateWorkflow("theburningmonk.com", "count_html_elements_cs", "1") .Attach(echo) .Attach(new[] { countDiv, countScripts, countSpans }, MatchesReducer) .Attach(echo) .Complete(); workflow.Start(client); }
public AWSRESTService(string awsAccessKey, string awsSecretAccessKey, string awsRegion) { _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient(awsAccessKey, awsSecretAccessKey, RegionEndpoint.GetBySystemName(awsRegion)); }
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); }
public static string GetServiceOutput() { var sb = new StringBuilder(1024); using (var sr = new StringWriter(sb)) { sr.WriteLine("==============================="); sr.WriteLine("| AWS Simple Workflow Service |"); sr.WriteLine("==============================="); try { // Print the available domains, workflows and activities. Region endpoint depends on where // you chose to set up your workflow domain var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2); sr.WriteLine(); var listDomainRequest = new ListDomainsRequest { RegistrationStatus = "REGISTERED" }; var listDomainResponse = swfClient.ListDomains(listDomainRequest); foreach (var domain in listDomainResponse.DomainInfos.Infos) { sr.WriteLine("[" + domain.Name + "]"); sr.WriteLine("status: " + domain.Status); sr.WriteLine("description: " + domain.Description); sr.WriteLine("\n WORKFLOWS"); var listWorkflowRequest = new ListWorkflowTypesRequest { Domain = domain.Name, RegistrationStatus = "REGISTERED" }; var listWorkflowTypesResponse = swfClient.ListWorkflowTypes(listWorkflowRequest); foreach ( var workflow in listWorkflowTypesResponse.WorkflowTypeInfos.TypeInfos) { sr.WriteLine(" [" + workflow.WorkflowType.Name + "] (" + workflow.WorkflowType.Version + ") " + workflow.Status); sr.WriteLine(" creation: " + workflow.CreationDate); sr.WriteLine(" deprecation: " + workflow.DeprecationDate); sr.WriteLine(" description:" + TrimStringToLength(workflow.Description, 60, "", " ")); sr.WriteLine(); } sr.WriteLine("\n ACTIVITIES"); var listActivityRequest = new ListActivityTypesRequest { Domain = domain.Name, RegistrationStatus = "REGISTERED" }; var listActivityResponse = swfClient.ListActivityTypes(listActivityRequest); foreach ( var activity in listActivityResponse.ActivityTypeInfos.TypeInfos) { sr.WriteLine(" [" + activity.ActivityType.Name + "] (" + activity.ActivityType.Version + ") " + activity.Status); sr.WriteLine(" creation: " + activity.CreationDate); sr.WriteLine(" deprecation: " + activity.DeprecationDate); sr.WriteLine(" description:" + TrimStringToLength(activity.Description, 60, "", " ")); sr.WriteLine(); } } } catch (AmazonSimpleWorkflowException ex) { if (ex.ErrorCode != null && ex.ErrorCode.Equals("AuthFailure")) { sr.WriteLine("The account you are using is not signed up for Amazon SWF."); sr.WriteLine("You can sign up for Amazon SWF at http://aws.amazon.com/swf"); } else { sr.WriteLine("Caught Exception: " + ex.Message); sr.WriteLine("Response Status Code: " + ex.StatusCode); sr.WriteLine("Error Code: " + ex.ErrorCode); sr.WriteLine("Error Type: " + ex.ErrorType); sr.WriteLine("Request ID: " + ex.RequestId); sr.WriteLine("Data: " + ex.Data); sr.WriteLine("Stacktrace: " + ex.StackTrace); } } sr.WriteLine(); } return(sb.ToString()); }