

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

# 在 Amazon SWF 中開發活動工作者
<a name="swf-dg-develop-activity"></a>

活動工作者提供一或多個活動類型的實作。活動工作者會與 Amazon SWF 通訊，以接收活動任務並進行執行。您可以有多個活動工作者執行相同活動類型的活動任務。

當決策者排程活動任務時，Amazon SWF 可讓活動工作者使用活動任務。當決策者排程活動任務時，它會提供活動工作者執行活動任務所需的資料 （由您決定）。Amazon SWF 會將此資料插入活動任務，再將其傳送給活動工作者。

活動工作者將由您管理。活動工作者可以使用任何語言進行撰寫。只要工作者可以透過 API 與 Amazon SWF 通訊，就可以在任何地方執行。由於 Amazon SWF 提供執行活動任務所需的所有資訊，因此所有活動工作者都可以無狀態。無狀態可讓工作流程具高度擴充性；若要處理增加的容量需求，只需要新增更多活動工作者即可。

本節將說明如何實作活動工作者。活動工作者應該重複執行下列作業。

1. 輪詢活動任務的 Amazon SWF。

1. 開始執行任務。

1. 如果任務長期存在，請定期向 Amazon SWF 報告活動訊號。

1. 報告任務已完成或失敗，並將結果傳回給 Amazon SWF。

**Topics**
+ [輪詢活動任務](#swf-dg-polling-activity-tasks)
+ [執行活動任務](#swf-dg-performing-activity-tasks)
+ [報告活動任務活動訊號](#swf-dg-managing-activity-tasks)
+ [完成或讓活動任務失敗](#swf-dg-complete-or-fail)
+ [啟動活動工作者](#swf-dg-launch-activity-workers)

## 輪詢活動任務
<a name="swf-dg-polling-activity-tasks"></a>

若要執行活動任務，每個活動工作者都必須定期呼叫 `PollForActivityTask`動作來輪詢 Amazon SWF。

在下列範例中，活動工作者 `ChargeCreditCardWorker01` 會輪詢任務清單 `ChargeCreditCard-v0.1` 上的任務。如果沒有可用的活動任務，在 60 秒後，Amazon SWF 會傳回空的回應。空回應是 `taskToken` 值為空白字串的 `Task` 結構。

```
https://swf.us-east-1.amazonaws.com
PollForActivityTask
{
  "domain" : "867530901",
  "taskList" : { "name": "ChargeCreditCard-v0.1" },
  "identity" : "ChargeCreditCardWorker01"
}
```

如果活動任務可用，Amazon SWF 會將其傳回給活動工作者。任務包含決策者在排程活動時指定的資料。

活動工作者收到活動任務之後，即準備好要執行工作。下節將提供執行活動任務的相關資訊。

## 執行活動任務
<a name="swf-dg-performing-activity-tasks"></a>

收到活動任務之後，活動工作者即準備好執行之。

**執行活動任務**

1. 程式設計活動工作者，解譯任務中輸入欄位的內容。此欄位包含決策者在排程任務時指定的資料。

1. 程式設計活動工作者，開始處理資料和執行您的邏輯。

下一節說明如何編寫活動工作者的程式，為 Amazon SWF 提供長時間執行活動的狀態更新。

## 報告活動任務活動訊號
<a name="swf-dg-managing-activity-tasks"></a>

如果已向活動類型註冊活動訊號逾時，則活動工作者必須在超過活動訊號逾時之前記錄活動訊號。如果活動任務未在逾時內提供活動訊號，則任務會逾時，Amazon SWF 會將其關閉並排程新的決策任務，以通知決策者逾時。決策者接著可以重新排程活動任務，或採取另一個動作。

如果在逾時後，活動工作者嘗試聯絡 Amazon SWF，例如透過呼叫 `RespondActivityTaskCompleted`，Amazon SWF 將傳回`UnknownResource`錯誤。

本節將說明如何提供活動的活動訊號。

若要記錄活動任務活動訊號，請程式設計活動工作者，呼叫 `RecordActivityTaskHeartbeat` 動作。此動作也提供字串欄位，可用來存放任意形式的資料，便於以適合您應用程式的方式來量化進度。

在此範例中，活動工作者向 Amazon SWF 報告活動訊號，並使用詳細資訊欄位報告活動任務已完成 40%。若要回報活動訊號，活動工作者必須指定活動任務的任務字符。

```
https://swf.us-east-1.amazonaws.com
RecordActivityTaskHeartbeat
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "details" : "40"
}
```

此動作本身不會在工作流程執行歷史記錄中建立事件；不過，如果任務逾時，則工作流程執行歷史記錄將會包含 `ActivityTaskTimedOut` 事件，以包含來自活動工作者所產生的最後一個活動訊號中的資訊。

## 完成或讓活動任務失敗
<a name="swf-dg-complete-or-fail"></a>

執行任務之後，活動工作者應該回報活動任務已完成還是失敗。

### 完成活動任務
<a name="completing-activity-task"></a>

若要完成活動任務，請程式設計活動工作者，在成功完成活動任務之後呼叫 `RespondActivityTaskCompleted` 動作，指定任務字符。

在此範例中，活動工作者指出任務已順利完成。

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskCompleted
{
  "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "results": "40"
}
```

當活動完成時，Amazon SWF 會為與活動相關聯的工作流程執行排程新的決策任務。

程式設計活動工作者，在即將完成任務之後輪詢另一個活動任務。這會建立活動工作者持續輪詢並完成任務的迴圈。

如果活動未在 *StartToCloseTimeout* 期間內回應，或超過 *ScheduleToCloseTimeout*，Amazon SWF 會逾時活動任務並排程決策任務。這可讓決策者採取適當的動作 (例如重新排程任務)。

例如，如果 Amazon EC2 執行個體正在執行活動任務，且執行個體在任務完成之前失敗，則決策者會在工作流程執行歷史記錄中收到逾時事件。如果活動任務使用活動訊號，決策者會在任務在 Amazon EC2 執行個體失敗後無法交付下一個活動訊號時收到事件。否則，活動任務無法在到達其中一個整體逾時之前完成時，決策者最終會收到事件。決策者接著可決定要重新指派任務，或採取其他動作。

### 讓活動任務失敗
<a name="failing-an-activity-task"></a>

如果活動工作者因為某些原因而無法執行活動任務，但仍然可以與 Amazon SWF 通訊，您可以對其進行程式設計以讓任務失敗。

若要程式設計活動工作者讓活動任務失敗，請程式設計活動工作者，呼叫可指定任務之任務字符的 `RespondActivityTaskFailed` 動作。

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskFailed
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "reason" : "CC-Invalid",
  "details" : "Credit Card Number Checksum Failed"
}
```

身為開發人員，您可以定義存放在原因和詳細資訊欄位中的值。這些是自由格式字串；您可以使用任何為您的應用程式提供服務的錯誤碼慣例。Amazon SWF 不會處理這些值。不過，Amazon SWF 可能會在主控台中顯示這些值。

當活動任務失敗時，Amazon SWF 會為與活動任務相關聯的工作流程執行排程決策任務，以通知決策者失敗。程式設計決策者，根據失敗的因素來處理失敗的活動，例如重新排程活動，或讓工作流程執行失敗。

## 啟動活動工作者
<a name="swf-dg-launch-activity-workers"></a>

若要啟動活動工作者，請將邏輯封裝至可用於活動工作者平台的執行檔。例如，您可以將活動程式碼封裝為可在 Linux 和 Windows 伺服器上執行的 Java 執行檔。

啟動之後，工作者會開始輪詢任務。決策者排程活動任務之前，這些輪詢會逾時且沒有任務，而工作者會繼續輪詢。

由於輪詢是傳出請求，活動工作者可以在可存取 Amazon SWF 端點的任何網路上執行。

您可以視需要啟動任意數目的活動工作者。當決策者排程活動任務時，Amazon SWF 會自動將活動任務分發給輪詢活動工作者。