

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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. 以 `GreeterActivitiesWorker` 做為進入點來建立可執行的 JAR 檔案。

1. 將步驟 1 的 JAR 檔案複製到另一個系統，只要支援 Java，任何作業系統皆可。

1. 確保具有相同 Amazon SWF 網域存取權的 AWS 登入資料可在其他系統上使用。

1. 執行 JAR 檔案。

1. 在您的開發系統中，使用 Eclipse 執行 `GreeterWorkflowWorker` 和 `GreeterMain`。

除了活動和工作流程工作者及工作流程啟動者在不同的系統中執行之外，工作流程運作的方式和 HelloWorldAsync 完全一致。不過，因為 `println`呼叫會列印「Hello World！」 到 主控台的活動中`say`，輸出會出現在執行活動工作者的系統上。