亚马逊跨境电商
在上一篇文章中,我解释了为什么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 {
@Override
public 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 {
@Override
public 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 {
@Override
public 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
亚马逊跨境电商