HelloWorldWorkflowParallel 应用程序 - AWS Flow Framework 适用于 Java

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

HelloWorldWorkflowParallel 应用程序

以前版本的 Hello World! 均使用线性工作流程拓扑。不过,Amazon SWF 并不仅限于线性拓扑。HelloWorldWorkflowParallel 应用程序是修改的 HelloWorldWorkflow 版本,它使用并行拓扑,如下图所示。

HelloWorldWorkflowParallel 工作流程拓扑

对于 HelloWorldWorkflowParallel,getNamegetGreeting 并行运行并分别返回问候语的一部分。然后,say 将两个字符串合并为问候语,并输出到控制台。

要实现该应用程序,请在您的项目目录中创建 helloWorld.HelloWorldWorkflow 程序包的副本,并将其命名为 helloWorld.HelloWorldWorkflowParallel。以下几节介绍了如何修改原始 HelloWorldWorkflow 代码以并行运行 getNamegetGreeting

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); } }

getNamegetGreeting 现在仅返回问候语字符串的一半。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 不会将任何输入传递到 getNamegetGreeting。两种方法都不会推迟执行,并立即并行执行关联的活动方法。

say 活动将 greetingname 作为输入参数。由于它们是 Promise<T> 对象,say 推迟执行,直到两个活动完成,然后构建并输出问候语。

请注意,HelloWorldWorkflowParallel 不使用任何特殊建模代码以定义工作流程拓扑。它使用标准 Java 流量控制并利用 Promise<T> 对象的属性来隐式执行该操作。适用于 Java 的 AWS Flow Framework 应用程序只需将 Promise<T> 对象与传统 Java 流程结合使用,即可实现复杂的拓扑结构。

HelloWorldWorkflowParallel 工作流程和活动主机和启动程序

HelloWorldWorkflowParallel 实现 GreeterWorker 以作为工作流程和活动实现的主机类。它与 HelloWorldWorkflow 实现完全相同,但 taskListToPoll 名称除外,它设置为“HelloWorldParallelList”。

HelloWorldWorkflowParallelGreeterMain 中实现工作流程启动程序,它与 HelloWorldWorkflow 实现完全相同。

要执行工作流程,请运行 GreeterWorkerGreeterMain,就像 HelloWorldWorkflow 一样。