本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HelloWorldWorkflowParallel 应用程序
以前版本的 Hello World! 均使用线性工作流程拓扑。不过,Amazon SWF 并不仅限于线性拓扑。HelloWorldWorkflowParallel 应用程序是修改的 HelloWorldWorkflow 版本,它使用并行拓扑,如下图所示。
对于 HelloWorldWorkflowParallel,getName
和 getGreeting
并行运行并分别返回问候语的一部分。然后,say
将两个字符串合并为问候语,并输出到控制台。
要实现该应用程序,请在您的项目目录中创建 helloWorld.HelloWorldWorkflow 程序包的副本,并将其命名为 helloWorld.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 非常相似;三个活动客户端方法是按顺序执行的。但活动不是按顺序执行的。
-
HelloWorldWorkflow 将
name
传递到getGreeting
。由于name
是一个Promise<T>
对象,getGreeting
推迟执行活动,直到getName
完成,因此,两个活动按顺序执行。 -
HelloWorldWorkflowParallel 不会将任何输入传递到
getName
或getGreeting
。两种方法都不会推迟执行,并立即并行执行关联的活动方法。
say
活动将 greeting
和 name
作为输入参数。由于它们是 Promise<T>
对象,say
推迟执行,直到两个活动完成,然后构建并输出问候语。
请注意,HelloWorldWorkflowParallel 不使用任何特殊建模代码以定义工作流程拓扑。它使用标准 Java 流量控制并利用 Promise<T>
对象的属性来隐式执行该操作。适用于 Java 的 AWS Flow Framework 应用程序只需将 Promise<T>
对象与传统 Java 流程结合使用,即可实现复杂的拓扑结构。
HelloWorldWorkflowParallel 工作流程和活动主机和启动程序
HelloWorldWorkflowParallel 实现 GreeterWorker
以作为工作流程和活动实现的主机类。它与 HelloWorldWorkflow 实现完全相同,但 taskListToPoll
名称除外,它设置为“HelloWorldParallelList”。
HelloWorldWorkflowParallel
在 GreeterMain
中实现工作流程启动程序,它与 HelloWorldWorkflow 实现完全相同。
要执行工作流程,请运行 GreeterWorker
和 GreeterMain
,就像 HelloWorldWorkflow
一样。