amazon云服务
在上一篇文章中,我解释了为什么AWS SWF服务很好,并宣布了新的Camel SWF组件。 现在,组件文档已准备就绪, 这是一个简单的完全可用的演示。 它包含三个独立的独立骆驼路线:
工作流生产者允许我们与工作流进行交互。 它可以启动新的工作流程执行,查询其状态,向正在运行的工作流程发送信号,或者终止并取消它。 在我们的演示中,WorkflowProducer启动了一条路线,该路线安排了 10个工作流程执行,每个执行都接收一个数字作为参数。
package com.ofbizian.swf.demo;import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;public class WorkflowProducer {public static String COMMON_OPTIONS ="accessKey=XXX"+ "&secretKey=XXX"+ "&domainName=demo"+ "&workflowList=demo-wlist"+ "&activityList=demo-alist"+ "&version=1.0"+ "&clientConfiguration.endpoint=swf.eu-west-12.amazonaws.com";public static void main(String[] args) throws Exception {Main main = new Main();main.enableHangupSupport();WorkflowProducerRoute route = new WorkflowProducerRoute();main.addRouteBuilder(route);main.run();}static class WorkflowProducerRoute extends RouteBuilder {@Overridepublic void configure() throws Exception {from("timer://workflowProducer?repeatCount=10").setBody(property("CamelTimerCounter")).to("aws-swf://workflow?" + COMMON_OPTIONS + "&eventName=calculator").log("SENT WORKFLOW TASK ${body}");}}
}
安排好工作流程执行后,我们需要一个流程来决定下一步的工作。 在Camel中,这是使用工作流使用者完成的。 工作流程使用者代表工作流程逻辑。 启动后,它将开始轮询工作流决策任务并对其进行处理。 除了处理决策任务之外,工作流使用者路由还将接收信号(从工作流生产者发送)或状态查询。 工作流使用者的主要目的是安排活动任务以使用活动生产者执行。 实际上,只能从工作流程使用者启动的线程中安排活动任务。
package com.ofbizian.swf.demo;import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.aws.swf.SWFConstants;
import org.apache.camel.main.Main;public class WorkflowConsumer {public static void main(String[] args) throws Exception {Main main = new Main();main.enableHangupSupport();WorkflowConsumerRoute route = new WorkflowConsumerRoute();main.addRouteBuilder(route);main.run();}static class WorkflowConsumerRoute extends RouteBuilder {@Overridepublic void configure() throws Exception {from("aws-swf://workflow?" + WorkflowProducer.COMMON_OPTIONS + "&eventName=calculator").choice().when(header(SWFConstants.ACTION).isEqualTo(SWFConstants.SIGNAL_RECEIVED_ACTION)).log("Signal received ${body}").when(header(SWFConstants.ACTION).isEqualTo(SWFConstants.GET_STATE_ACTION)).log("State asked ${body}").when(header(SWFConstants.ACTION).isEqualTo(SWFConstants.EXECUTE_ACTION)).setBody(simple("${body[0]}")).log("EXECUTION TASK RECEIVED ${body}").filter(simple("${body} > 5")).to("aws-swf://activity?" + WorkflowProducer.COMMON_OPTIONS + "&eventName=incrementor");}}}
我们的演示决策器中的逻辑很简单:如果传入的参数大于5,我们将安排任务执行。 否则,由于没有其他任务要执行,因此工作流将完成。 请注意,它还具有处理信号和状态查询事件的分支。
我们的分布式工作流应用程序(因为它包含三个独立的应用程序)的最后一个选择是ActivityConsumer,它实际上执行一些计算。 它具有最简单的实现:递增给定参数并返回它。
package com.ofbizian.swf.demo;import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;public class ActivityConsumer {public static void main(String[] args) throws Exception {Main main = new Main();main.enableHangupSupport();ActivityConsumerRoute route = new ActivityConsumerRoute();main.addRouteBuilder(route);main.run();}static class ActivityConsumerRoute extends RouteBuilder {@Overridepublic void configure() throws Exception {
from("aws-swf://activity?" + WorkflowProducer.COMMON_OPTIONS + "&eventName=incrementor").setBody(simple("${body[0]}")).log("RECEIVED ACTIVITY TASK ${body}").setBody(simple("${body}++"));}}
}
运行此演示所需要做的只是创建适当的工作流域并将密钥/秘密添加到路由中。
翻译自: https://www.javacodegeeks.com/2014/01/a-camel-demo-for-amazons-simple-worklfow-service.html
amazon云服务