

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

# 在 Amazon SWF 中取消活動任務
<a name="swf-dg-task-cancellation"></a>

活動任務取消會通知決策者結束不再需要執行的活動。Amazon SWF 使用合作取消機制，不會強制中斷執行中的活動任務。您必須以程式設計活動工作者，處理取消請求。

決策者可以在活動任務處理決策任務之時，決定取消活動任務。若要取消活動任務，決策者會使用 `RespondDecisionTaskCompleted` 動作與 `RequestCancelActivityTask` 決策。

如果活動任務未有活動工作者取走，則服務會取消任務。請注意，可能的競爭條件是活動工作者隨時都可以取得任務。如果任務已指派給活動工作者，則會請求活動工作者取消任務。

在此範例中，會將取消訂單的訊號傳送給工作流程執行。

```
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 會傳回成功的 HTTP 回應，如下所示。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`請求時，它會更新工作流程執行歷史記錄，並排程決策任務以通知決策者。

程式設計決策者以處理決策任務，並傳回任何額外決策。如果成功取消活動任務，請程式設計決策者，以執行繼續或關閉工作流程執行所需的任務。如果未成功取消活動任務，請程式設計決策者，以接受結果、忽略結果，或為任何必要的清理排程。