

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

# 任務工作流程
<a name="jobs-workflow-jobs-online"></a>

以下顯示了任務工作流程中從開始新任務到報告任務執行完成狀態的各個步驟。

## 開始新任務
<a name="jobs-respond-new-job"></a>

建立新任務時，AWS IoTJobs 會在每個目標裝置的 `$aws/things/{{thing-name}}/jobs/notify`主題上發佈訊息。

訊息包含下列資訊：

```
{
    "timestamp":1476214217017,
    "jobs":{
        "QUEUED":[{
            "jobId":"0001",
            "queuedAt":1476214216981,
            "lastUpdatedAt":1476214216981,
            "versionNumber" : 1
        }]
    }
}
```

當任務執行排入佇列時，裝置就會收到這個以 `'$aws/things/{{thingName}}/jobs/notify'` 為主題的訊息。

**注意**  
對於設有選擇性 `SchedulingConfig` 的任務，任務會維持 `SCHEDULED` 的初始狀態。當任務達到選定的 `startTime` 時，會發生下列情形：  
任務狀態將更新為 `IN_PROGRESS`。
任務會開始將任務文件推展至目標群組中的所有裝置。

## 取得任務資訊
<a name="jobs-respond-get-job"></a>

若需取得更多有關任務執行的資訊，該裝置會呼叫 [DescribeJobExecution](jobs-mqtt-api.md#mqtt-describejobexecution) MQTT API，且 `includeJobDocument` 欄位將設為 `true` (此為預設)。

如果請求成功，AWS IoT任務服務會發佈`$aws/things/MyThing/jobs/0023/get/accepted`主題的訊息：

```
{
    "clientToken" : "client-001",
    "timestamp" : 1489097434407,
    "execution" : {
        "approximateSecondsBeforeTimedOut": number,
        "jobId" : "023",
        "status" : "QUEUED",
        "queuedAt" : 1489097374841,
        "lastUpdatedAt" : 1489097374841,
        "versionNumber" : 1,
        "jobDocument" : {
            < contents of job document >
        }
    }
}
```

如果請求失敗，AWS IoT任務服務會在`$aws/things/MyThing/jobs/0023/get/rejected`主題上發佈訊息。

裝置現在具有可用於執行任務遠端操作的任務文件。如果任務文件包含 Amazon S3 預先簽章的 URL，則裝置可以使用此 URL 下載任務需要的所有檔案。

## 報告任務執行狀態
<a name="jobs-job-processing"></a>

裝置執行工作時，可以呼叫 [UpdateJobExecution](jobs-mqtt-api.md#mqtt-updatejobexecution)MQTT API 以更新工作執行的狀態。

例如，裝置可以藉由以 `IN_PROGRESS` 主題發佈下列訊息而將任務執行狀態更新為 `$aws/things/MyThing/jobs/0023/update`：

```
{
    "status":"IN_PROGRESS",
    "statusDetails": {
        "progress":"50%"
    },
    "expectedVersion":"1",
    "clientToken":"client001"
}
```

任務會透過將訊息發佈至 `$aws/things/MyThing/jobs/0023/update/accepted` 或 `$aws/things/MyThing/jobs/0023/update/rejected` 主題進行回應：

```
{
    "clientToken":"client001",
    "timestamp":1476289222841
}
```

裝置可以透過呼叫 [StartNextPendingJobExecution](jobs-mqtt-api.md#mqtt-startnextpendingjobexecution) 來合併前兩個請求。這會取得並開始下一個待定任務執行，並能讓裝置更新任務執行狀態。此請求也會在任務執行待定時傳回任務文件。

如果任務包含 [TimeoutConfig](https://docs.aws.amazon.com//iot/latest/apireference/API_TimeoutConfig.html)，則進行中計時器會開始執行。您也可以設定任務執行的步驟計時器，方法是在您呼叫 [UpdateJobExecution](https://docs.aws.amazon.com//iot/latest/apireference/API_iot-jobs-data_UpdateJobExecution.html) 時設定 `stepTimeoutInMinutes` 的值。步驟計時器僅適用於您更新的任務執行。您可以在每次更新任務執行時，為此計時器設定新值。當您呼叫 [StartNextPendingJobExecution](https://docs.aws.amazon.com//iot/latest/apireference/API_iot-jobs-data_StartNextPendingJobExecution.html) 時，您也可以建立步驟計時器。如果任務執行維持在 `IN_PROGRESS` 狀態的時間超過步驟計時器隔時，任務執行就會失敗，並切換到終止的 `TIMED_OUT` 狀態。當您建立任務時，步驟計時器不會影響您設定的進行中計時器。

`status` 欄位可以設定為 `IN_PROGRESS`、`SUCCEEDED` 或 `FAILED`。若任務執行已經處於結束狀態，您就無法更新其狀態。

## 報告執行完成
<a name="jobs-job-completed"></a>

裝置完成執行工作時，會呼叫 [UpdateJobExecution](jobs-mqtt-api.md#mqtt-updatejobexecution)MQTT API。如果任務成功，則將 `status` 設定為 `SUCCEEDED`，並在訊息酬載的 `statusDetails` 中以名稱值對的方式加入任務的其他相關資訊。任務執行完成時，執行中與步驟計時器會結束。

例如：

```
{
    "status":"SUCCEEDED",
    "statusDetails": {
        "progress":"100%"
    },
    "expectedVersion":"2",
    "clientToken":"client-001"
}
```

如果任務不成功，則將 `status`設定為 `FAILED`，並在 `statusDetails` 加入所發生錯誤的資訊：

```
{
    "status":"FAILED",
    "statusDetails": {
        "errorCode":"101",
        "errorMsg":"Unable to install update"
    },
    "expectedVersion":"2",
    "clientToken":"client-001"
}
```

**注意**  
`statusDetails` 屬性可以包含任意數量的名稱值對。

當 AWS IoTJobs 服務收到此更新時，它會在`$aws/things/MyThing/jobs/notify`主題上發佈訊息，指出任務執行已完成：

```
{
    "timestamp":1476290692776,
    "jobs":{}
}
```

## 額外任務
<a name="jobs-additional-job"></a>

如果裝置還有其他待定的任務執行，則會包含在發佈至 `$aws/things/MyThing/jobs/notify` 的訊息中。

例如：

```
{
    "timestamp":1476290692776,
    "jobs":{
        "QUEUED":[{
            "jobId":"0002",
            "queuedAt":1476290646230,
            "lastUpdatedAt":1476290646230
        }],
        "IN_PROGRESS":[{
            "jobId":"0003",
            "queuedAt":1476290646230,
            "lastUpdatedAt":1476290646230
        }]
    }
}
```