

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

# 取消亚马逊 SWF 中的活动任务
<a name="swf-dg-task-cancellation"></a>

取消活动任务会通知决策者结束不再需要执行的活动。Amazon SWF 使用合作取消机制，不会强行中断正在运行的活动任务。您必须给您的活动工作程序编程，以处理取消请求。

决策程序可决定在活动任务正在处理决策任务时取消该活动任务。要取消活动任务，决策程序可使用带 `RequestCancelActivityTask` 决策的 `RespondDecisionTaskCompleted` 操作。

如果活动工作程序尚未获得活动任务，则服务将取消任务。请注意，存在一种潜在的竟态条件，活动工作程序可在此条件中随时获取任务。如果任务已分配给活动工作程序，则该活动工作程序将被请求取消任务。

在这个示例中，将会发送取消订单信号到工作流程执行。

```
https://swf.us-east-1.amazonaws.com
SignalWorkflowExecution
{"domain": "867530901",
 "workflowId": "20110927-T-1",
 "runId": "9ba33198-4b18-4792-9c15-7181fb3a8852",
 "signalName": "CancelOrder",
 "input": "order 3553"}
```

如果工作流执行收到信号，Amazon SWF 将返回类似于以下内容的请求。Amazon SWF 将生成一个决策任务，通知决策程序处理信号。

```
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 6c0373ce-074c-11e1-9083-8318c48dee96
```

当决策程序处理决策任务并查看历史信号时，决策程序会尝试取消具有 `ShipOrderActivity0001` 活动 ID 的未解决活动。活动 ID 在排定活动任务事件的工作流程历史中有提供。

```
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
  "taskToken":"12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "decisions":[{
          "decisionType":"RequestCancelActivityTask",
          "RequestCancelActivityTaskDecisionAttributes":{
              "ActivityID":"ShipOrderActivity0001"
          }
      }
  ]
}
```

如果 Amazon SWF 成功接收取消请求，将会返回与下面类似的成功 HTTP 响应：

```
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 6c0373ce-074c-11e1-9083-8318c48dee96
```

取消尝试以 `ActivityTaskCancelRequested` 事件的形式记录在历史中。

如果任务成功取消（如 `ActivityTaskCanceled` 事件所示），您需要对决策程序进行编程，使其在任务取消后采取相应的步骤，例如关闭工作流执行。

如果活动任务无法取消（例如，任务完成、失败或超时而不是取消），则决定程序应接受活动结果，或执行使用案例所需的任何清理或缓解措施。

如果活动工作程序已获得活动任务，则取消请求将通过任务检测信号机制发送。活动工作线程可定期使用 `RecordActivityTaskHeartbeat` 向 Amazon SWF 报告任务仍在进行中。

请注意，虽然建议执行长期运行的任务，但不需要活动工作程序检测信号。任务取消需要记录定期检测信号；如果工作程序不检测信号，则不能取消任务。

如果决策程序请求取消任务，则 Amazon SWF 会将 `cancelRequest` 对象的值设置为 true。`cancelRequest` 数据元是 `ActivityTaskStatus` 数据元的一部分，由服务响应 `RecordActivityTaskHeartbeat` 而返回。

Amazon SWF 不会阻止已请求取消的活动任务的成功完成；如何处理取消请求取决于活动。根据您的要求，对活动工作程序进行编程，以取消活动任务或忽略取消请求。

如果您希望活动工作程序指出该活动任务的工作已取消，请对其进行编程以响应 `RespondActivityTaskCanceled`。如果您希望活动工作程序完成任务，请对其进行编程以响应标准 `RespondActivityTaskCompleted`。

当 Amazon SWF 收到 `RespondActivityTaskCompleted` 或 `RespondActivityTaskCanceled` 请求时，会更新工作流执行历史并安排决策任务以通知决策程序。

对决策程序进行编程以处理决策任务和返回任何附加决策。如果活动任务被成功取消，请对决策程序进行编程以执行需要继续的任务或关闭工作流程执行。如果活动任务未成功取消，请对决策程序进行编程以接受结果、忽略结果或安排任何必要的清除。