

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

# HelloWorldWorkflowParallel 應用程式
<a name="getting-started-example-helloworldworkflowparallel"></a>

先前的 Hello World\$1 版本皆使用線性工作流程拓撲。不過，Amazon SWF 不限於線性拓撲。HelloWorldWorkflowParallel 應用程式即為 HelloWorldWorkflow 的修改版本，使用平行拓撲，如下圖所示。

![\[HelloWorldWorkflowParallel 工作流程拓撲\]](http://docs.aws.amazon.com/zh_tw/amazonswf/latest/awsflowguide/images/helloworld_parallel_topology.png)


使用 HelloWorldWorkflowParallel，`getName` 和 `getGreeting` 會平行執行問候語的每個傳回部分。`say` 接著會將兩個字串合併到問候語，並將之列印至主控台。

若要實作應用程式，請在您的專案目錄中建立 helloWorld.HelloWorldWorkflow 套件的副本，並命名為 helloWorld.HelloWorldWorkflowParallel。下列各節說明如何修改原始 HelloWorldWorkflow 程式碼以平行執行 `getName` 和 `getGreeting`。

## HelloWorldWorkflowParallel 活動工作者
<a name="getting-started-example-helloworldworkflowparallel.activities"></a>

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 工作流程工作者
<a name="getting-started-example-helloworldworkflowparallel-worker"></a>

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>` 物件的屬性來隱含地執行此操作。 AWS Flow Framework 對於 Java 應用程式，只需搭配傳統 Java 控制流程建構使用`Promise<T>`物件，即可實作甚至複雜的拓撲。

## HelloWorldWorkflowParallel 工作流程和活動主機與啟動者
<a name="HelloWorldWorkflowParallel-workflow-activities-host-starter"></a>

HelloWorldWorkflowParallel 將 `GreeterWorker` 實作為工作流程和活動實作的主機類別。它與 HelloWorldWorkflow 實作相同，差別在於 `taskListToPoll` 名稱設為 "HelloWorldParallelList"。

`HelloWorldWorkflowParallel` 會在 `GreeterMain` 中實作工作流程啟動者，而且與 HelloWorldWorkflow 實作相同。

若要執行工作流程，請執行 `GreeterWorker` 和 `GreeterMain`，如同 `HelloWorldWorkflow`。