本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HelloWorldWorkflowDistributed 应用程序
使用 HelloWorldWorkflow 和 HelloWorldWorkflowAsync,Amazon SWF 可以协调工作流和活动实现之间的交互,但它们作为单个进程在本地运行。GreeterMain
位于单独的进程中,但仍在同一系统上运行。
Amazon SWF 的一个重要功能是支持分布式应用程序。例如,您可以在 Amazon EC2 实例上运行工作流工作线程,在数据中心计算机上运行工作流启动程序,在客户端台式计算机上运行活动。您甚至可以在不同的系统上运行不同的活动。
HelloWorldWorkflowDistributed 应用程序扩展了 HelloWorldWorkflowAsync 以在两个系统和三个进程之间分配应用程序。
-
工作流程和工作流程启动程序作为单独的进程在一个系统上运行。
-
活动在不同的系统上运行。
要实现该应用程序,请在您的项目目录中创建 helloWorld.HelloWorldWorkflowAsync 程序包的副本,并将其命名为 helloWorld.HelloWorldWorkflowDistributed。以下几节介绍了如何修改原始 HelloWorldWorkflowAsync 代码以在两个系统和三个进程之间分配应用程序。
您不需要更改工作流程或活动实现以在不同的系统上运行,甚至不需要更改版本号。您也不需要修改 GreeterMain
。您只需要更改活动和工作流程主机。
对于 HelloWorldWorkflowAsync,单个应用程序用作工作流程和活动主机。要在不同的系统上运行工作流程和活动实现,您必须实现单独的应用程序。从项目中删除 GreeterWorker 并添加两个新类文件 (GreeterWorkflowWorker 和 GreeterActivitiesWorker)。
HelloWorldWorkflowDistributed 在 GreeterActivitiesWorker 中实现其活动主机,如下所示:
import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; public class GreeterActivitiesWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldExamples"; String taskListToPoll = "HelloWorldAsyncList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); } }
HelloWorldWorkflowDistributed 在 GreeterWorkflowWorker
中实现其工作流程主机,如下所示:
import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorkflowWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldExamples"; String taskListToPoll = "HelloWorldAsyncList"; WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }
请注意,GreeterActivitiesWorker
就是没有 WorkflowWorker
代码的 GreeterWorker
,GreeterWorkflowWorker
就是没有 ActivityWorker
代码的 GreeterWorker
。
要运行工作流程,请执行以下操作:
-
创建一个可运行的 JAR 文件并将
GreeterActivitiesWorker
作为入口点。 -
将步骤 1 中的 JAR 文件复制到另一个系统,该系统可以运行支持 Java 的任何操作系统。
-
确保在其他系统上提供可访问相同 AWS 域的 AWS 凭证。
-
运行 JAR 文件。
-
在您的开发系统上,使用 Eclipse 运行
GreeterMain
和GreeterWorkflowWorker
。
除了在与工作流程工作线程和工作流程启动程序不同的系统上运行活动以外,工作流程的工作方式与 HelloWorldAsync 完全相同。但是,输出到控制台的“Hello World!”的 println
调用 是在 say
活动中进行的,因此,输出将显示在运行活动工作线程的系统上。