

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

# 執行使用 AWS Flow Framework 適用於 Java 的 編寫的程式
<a name="running"></a>

**Topics**
+ [WorkflowWorker](#running.workflowworker)
+ [ActivityWorker](#running.activityworker)
+ [工作者執行緒模型](#running.threadingmodel)
+ [工作者可擴充性](#running.workerextend)

框架提供*工作者類別*來初始化 AWS Flow Framework 適用於 Java 的 執行時間，並與 Amazon SWF 通訊。為實作工作流程或活動工作者，您必須建立及啟動工作者類別的執行個體。這些工作者類別負責管理持續的非同步操作、調用解除封鎖的非同步方法，以及與 Amazon SWF 通訊。它們可使用工作流程和活動實作、執行緒數目、要輪詢的任務清單等設定而成。

框架提供兩種工作者類別，一個用於活動，一個用於工作流程。為執行工作流程邏輯，您要使用 `WorkflowWorker` 類別。同樣地，在活動方面則使用 `ActivityWorker` 類別。這些類別會自動輪詢 Amazon SWF 以取得活動任務，並在實作中調用適當的方法。

下列範例說明如何執行個體化 `WorkflowWorker` 並開始輪詢任務：

```
AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials);
WorkflowWorker worker = new WorkflowWorker(swfClient, "domain1", "tasklist1");
// Add workflow implementation types
worker.addWorkflowImplementationType(MyWorkflowImpl.class);

// Start worker
worker.start();
```

建立 `ActivityWorker` 之執行個體和開始輪詢任務的基本步驟如下：

```
AmazonSimpleWorkflow swfClient
      = new AmazonSimpleWorkflowClient(awsCredentials);
ActivityWorker worker = new ActivityWorker(swfClient,
                                           "domain1",
                                           "tasklist1");
worker.addActivitiesImplementation(new MyActivitiesImpl());

// Start worker
worker.start();
```

當您想要關閉活動或決策者時，您的應用程式應該關閉正在使用的工作者類別執行個體，以及 Amazon SWF Java 用戶端執行個體。這會確保工作者類型使用的所有資源都正確釋出。

```
worker.shutdown();
worker.awaitTermination(1, TimeUnit.MINUTES);
```

為啟動執行，請只建立產生之外部用戶端的執行個體，並呼叫 `@Execute` 方法。

```
MyWorkflowClientExternalFactory factory = new MyWorkflowClientExternalFactoryImpl();
MyWorkflowClientExternal client = factory.getClient();
client.start();
```

## WorkflowWorker
<a name="running.workflowworker"></a>

如名稱所示，此工作者類別目的在供工作流程實作使用。它以任務清單和工作流程實作類型設定而成。工作者類型會執行迴圈來輪詢指定任務清單中的決策任務。收到決策任務時，它會建立工作流程實作的執行個體，並呼叫 `@Execute` 方法處理任務。

## ActivityWorker
<a name="running.activityworker"></a>

若要實作活動工作者，您可使用 `ActivityWorker` 類別以便向任務清單輪詢活動任務。您可使用活動實作物件設定活動工作者。此工作者類型會執行迴圈來輪詢指定任務清單中的活動任務。收到活動任務時，它會尋找您提供的適合實作，並呼叫活動方法處理任務。與呼叫 factory 為每項決策任務建立新執行個體的 `WorkflowWorker` 不同，`ActivityWorker` 只使用您提供的物件。

`ActivityWorker` 類別使用 AWS Flow Framework 適用於 Java 的 註釋來判斷註冊和執行選項。

## 工作者執行緒模型
<a name="running.threadingmodel"></a>

在 AWS Flow Framework 適用於 Java 的 中，活動或決策者是工作者類別的執行個體。您的應用程式負責在應做為工作者的每部電腦和每項程序上設定和執行個體化工作者物件。然後，工作者物件會自動從 Amazon SWF 接收任務，將其分派到您的活動或工作流程實作，並向 Amazon SWF 報告結果。單一工作流程執行個體可能跨多個工作者。當 Amazon SWF 有一或多個待處理活動任務時，它會將任務指派給第一個可用的工作者，然後下一個工作者，以此類推。這讓屬於同一個工作流程執行個體的任務可能同時在不同的工作者上處理。

![AWS Flow Framework 適用於 Java 型應用程式的拓撲](http://docs.aws.amazon.com/zh_tw/amazonswf/latest/awsflowguide/images/threading.png)


此外，每個工作者都可設定成在多個執行緒上處理任務。這表示即使只有一個工作者，工作流程執行個體的活動任務也可以同時執行。

決策任務的行為與 Amazon SWF 保證給定工作流程執行一次只能執行一個決策的例外狀況類似。單一工作流程執行一般需要多項決策任務，因此結果可能也會在多個程序和執行緒上執行。決策者以該類型的工作流程實作設定而成。當決策者收到決策任務時，它會建立工作流程實作的執行個體 (物件)。框架提供可擴充的 factory 模式來建立這些執行個體。預設工作流程 factory 每次都會建立新的物件。您可提供自訂的 factory 來覆寫此行為。

與以工作流程實作類型設定的決策者相反，活動工作者以活動實作的執行個體 (物件) 設定而成。當活動工作者收到活動任務時，它會分派給合適的活動實作物件。

![工作者類別的執行緒模型](http://docs.aws.amazon.com/zh_tw/amazonswf/latest/awsflowguide/images/executor.png)


工作流程工作者會維護單一執行緒集區，並在用來輪詢 Amazon SWF 任務的相同執行緒上執行工作流程。由於活動長時間執行 （至少與工作流程邏輯相比），活動工作者類別會維護兩個單獨的執行緒集區；一個用於透過執行活動實作輪詢 Amazon SWF 活動任務，另一個用於處理任務。這可讓您分別設定要輪詢任務的執行緒數目，及要執行該任務的執行緒數目。例如，您可使用少數執行緒來輪詢，並用多數執行緒來執行任務。活動工作者類別只會在具有免費輪詢執行緒和免費執行緒來處理任務時輪詢任務的 Amazon SWF。

這種執行緒和執行個體行為表示：

1. 活動實作必須無狀態。您不應使用執行個體變數將應用程式狀態存放在活動物件中。但是，您可以使用欄位存放資源，例如資料庫連線。

1. 活動實作必須是安全執行緒。由於相同執行個體可用來同時處理來自不同執行緒的任務，因此必須同步從活動程式碼存取共用資源。

1. 工作流程實作可以具有狀態，而執行個體變數可用來存放狀態。即使建立了新的工作流程實作執行個體來處理每項決策任務，框架仍會確保正確地重新建立該狀態。但是，工作流程實作必須具有確定性。如需詳細資訊，請參閱「[了解 AWS Flow Framework 適用於 Java 的 中的任務](details.md)」一節。

1. 在使用預設 factory 時，工作流程實作不需安全執行緒。預設實作會確保一次只有一個執行緒使用工作流程實作執行個體。

## 工作者可擴充性
<a name="running.workerextend"></a>

 AWS Flow Framework 適用於 Java 的 也包含幾個低階工作者類別，可為您提供精細的控制和可擴展性。使用它們，您可完全自訂工作流程和活動類型註冊，並設定 factory 來建立實作物件。這些工作者為 `GenericWorkflowWorker` 和 `GenericActivityWorker`。

`GenericWorkflowWorker` 可使用 factory 設定以建立工作流程定義 factory。工作流程定義 factory 負責建立工作流程實作的執行個體，及提供註冊選項這類組態設定。在一般的情況下，您應該直接使用 `WorkflowWorker` 類別。它會自動建立並設定框架中提供的 factory 實作，即 `POJOWorkflowDefinitionFactoryFactory` 和 `POJOWorkflowDefinitionFactory`。factory 要求工作流程實作類別必須具有無引數的建構函數。此建構函數用於在執行時間建立工作流程物件的執行個體。factory 會查看您在工作流程界面和實作上使用的註釋，以建立適合的註冊和執行選項。

您可透過實作 `WorkflowDefinitionFactory`、`WorkflowDefinitionFactoryFactory` 和 `WorkflowDefinition`，提供自己的 factory 實作。工作者類別使用 `WorkflowDefinition` 類別來分派決策任務和訊號。透過實作這些基礎類別，您可完全自訂 factory 和工作流程實作請求的分派。例如，您可使用這些可擴充性點提供自訂的程式設計模型撰寫工作流程，例如，根據您自己的註釋來撰寫或從 WSDL 產生它，而不是框架使用的第一個程式碼方法。為使用您自訂的 factory，您必須使用 `GenericWorkflowWorker` 類別。如需這些類別的詳細資訊，請參閱 適用於 Java 的 AWS SDK 文件。

同樣地，`GenericActivityWorker` 可讓您提供自訂活動實作 factory。透過實作 `ActivityImplementationFactory` 和 `ActivityImplementation` 類別，您可完全控制活動執行個體化以及自訂註冊和執行選項。如需這些類別的詳細資訊，請參閱 適用於 Java 的 AWS SDK 文件。