本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HelloWorldWorkflowParallel 应用程序
以前版本的 Hello World! 均使用线性工作流程拓扑。不过,Amazon SWF 并不仅限于线性拓扑。该 HelloWorldWorkflowParallel 应用程序是使用并行拓扑的 HelloWorldWorkflow 修改版本,如下图所示。
使用 HelloWorldWorkflowParallel,getName并行getGreeting运行,分别返回问候语的一部分。say然后将这两个字符串合并为问候语,并将其打印到控制台。
要实现该应用程序,请在您的项目目录中创建 hello World.HelloWorldWorkflow 包的副本并将其命名为 hello World.HelloWorldWorkflowParallel。以下各节介绍如何修改原始 HelloWorldWorkflow 代码以使其getName并getGreeting行运行。
HelloWorldWorkflowParallel 活动工作人员
HelloWorldWorkflowParallel 活动接口是在中实现的GreeterActivities,如以下示例所示。
import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="5.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public String getGreeting(); public void say(String greeting, String name); }
该接口与类似 HelloWorldWorkflow,但有以下例外:
-
getGreeting不使用任何输入;它仅返回问候语字符串。 -
say使用两种输入字符串:问候语和名称。 -
该接口具有新的版本号,在任何时候更改注册的接口时,需要使用该版本号。
HelloWorldWorkflowParallel 在中实施活动GreeterActivitiesImpl,如下所示:
public class GreeterActivitiesImpl implements GreeterActivities { @Override public String getName() { return "World!"; } @Override public String getGreeting() { return "Hello "; } @Override public void say(String greeting, String name) { System.out.println(greeting + name); } }
getName 和 getGreeting 现在仅返回问候语字符串的一半。say 连接两个部分以生成完整的短语,并将其输出到控制台。
HelloWorldWorkflowParallel 工作流程工作者
工作 HelloWorldWorkflowParallel 流界面在中实现GreeterWorkflow,如下所示:
import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "5.0") public void greet(); }
该类与 HelloWorldWorkflow 版本相同,唯一的不同是版本号已更改以匹配活动工作人员。
工作流程是在 GreeterWorkflowImpl 中实现的,如下所示:
import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = operations.getGreeting(); operations.say(greeting, name); } }
乍一看,这个实现看起来非常相似 HelloWorldWorkflow;客户端方法按顺序执行的三个 Activity。但活动不是按顺序执行的。
-
HelloWorldWorkflow 传递
name给getGreeting。由于name是一个Promise<T>对象,getGreeting推迟执行活动,直到getName完成,因此,两个活动按顺序执行。 -
HelloWorldWorkflowParallel 未传递任何输入
getName或getGreeting。两种方法都不会推迟执行,并立即并行执行关联的活动方法。
say 活动将 greeting 和 name 作为输入参数。由于它们是 Promise<T> 对象,say 推迟执行,直到两个活动完成,然后构建并输出问候语。
请注意, HelloWorldWorkflowParallel 不使用任何特殊的建模代码来定义工作流程拓扑。它通过使用标准的 Java 流量控制和利用Promise<T>对象的属性来隐含地做到这一点。 AWS Flow Framework 对于 Java 应用程序只需将Promise<T>对象与传统的 Java 控制流结构结合使用即可实现甚至复杂的拓扑。
HelloWorldWorkflowParallel 工作流程和活动主持人和初学者
HelloWorldWorkflowParallel 实现GreeterWorker为工作流程和活动实现的主机类。除了名称之外,它与 HelloWorldWorkflow 实现相同,taskListToPoll名称设置为 “HelloWorldParallelList”。
HelloWorldWorkflowParallel在中实现了工作流程启动器GreeterMain,它与实现相同。 HelloWorldWorkflow
要执行工作流程,请运行 GreeterWorker 和 GreeterMain,就像 HelloWorldWorkflow 一样。