

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

# HelloWorldWorkflowDistributed 应用程序
<a name="getting-started-example-helloworldworkflowdistributed"></a>

使用 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`。

**要运行工作流程，请执行以下操作：**

1. 创建一个可运行的 JAR 文件并将 `GreeterActivitiesWorker` 作为入口点。

1. 将步骤 1 中的 JAR 文件复制到另一个系统，该系统可以运行支持 Java 的任何操作系统。

1. 确保能够访问同一 Amazon SWF 域的 AWS 凭证可在其他系统上使用。

1. 运行 JAR 文件。

1. 在您的开发系统上，使用 Eclipse 运行 `GreeterMain` 和 `GreeterWorkflowWorker`。

除了活动在与工作流程工作人员和工作流程启动者不同的系统上运行之外，工作流程的工作方式与完全相同 HelloWorldAsync。但是，输出到控制台的“Hello World\$1”的 `println` 调用 是在 `say` 活动中进行的，因此，输出将显示在运行活动工作线程的系统上。