

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

# 任务流
<a name="jobs-workflow-jobs-online"></a>

下面显示了任务工作流程中的不同步骤，从启动新任务到报告任务执行的完成状态。

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

创建新任务后，J AWS IoT obs 会为每台目标设备发布一条有关该`$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"
}
```

Jobs 通过将消息发布到 `$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)，则正在进行的计时器开始运行。您还可以通过设置调用时的值来为任务执行设置步进计`stepTimeoutInMinutes`时器[UpdateJobExecution](https://docs.aws.amazon.com//iot/latest/apireference/API_iot-jobs-data_UpdateJobExecution.html)。步骤计时器仅应用于您更新的任务执行。您每次更新任务执行时，可以为此计时器设置新值。您也可以在呼叫时创建计步器[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 IoT Jobs 服务收到此更新时，它会发布一条有关该`$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
        }]
    }
}
```