

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

# 在 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 会发回一个空响应。空响应是一个 `Task` 结构，在该结构中，`taskToken` 值为空字符串。

```
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 实例正在执行活动任务，而该实例在任务完成之前失败，则决策者会在工作流程执行历史中收到超时事件。如果活动任务使用心跳，则在 Ama EC2 zon 实例失败后任务未能传送下一个心跳时，决策者会收到该事件。否则，决策程序会在活动任务触及整个超时值中的一个前完成失败时最终接收事件。然后，由决策程序决定重新分配任务或采取某些其它操作。

### 活动任务失败
<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>

要启动活动工作线程，将您的逻辑打包成可执行，这样您就可以将其用于您的活动工作线程平台上。例如，您可以将您的活动代码打包成 Java 可执行，这样您就可以将其用于 Linux 和 Windows 服务器上。

启动后，您的工作线程即会开始轮询任务。在决策程序排定活动任务之前，虽然这些轮询超时未轮询到任务，但您的工作线程只会继续轮询。

由于轮询是出站请求，活动工作线程可以在任何有权访问 Amazon SWF 端点的网站上运行。

您想要启动多少活动工作线程就可以启动多少。在决策程序安排活动任务时，Amazon SWF 会将活动任务自动分配给轮询活动工作线程。