

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

# 任务通知
<a name="jobs-comm-notifications"></a>

当任务处于待处理状态或列表中的第一个任务执行发生变化时，Amazon IoT作业服务会向保留主题发布 MQTT 消息。设备可通过订阅这些主题来跟踪待处理任务。

## 任务通知类型。
<a name="jobs-comm-notifications-types"></a>

任务通知将作为 JSON 有效载荷发布到 MQTT 主题。通知有两种：

**ListNotification**

`ListNotification` 包含一个列表，其中待处理的任务执行不超过 15 个。它们依次按照状态（`IN_PROGRESS` 任务执行在 `QUEUED` 任务执行之前）和排队的时间进行排序。

如果满足以下条件之一，则发布 `ListNotification`。
+ 新的任务执行已排队或更改为非最终状态（`IN_PROGRESS` 或 `QUEUED`）。
+ 旧的任务执行更改为最终状态（`FAILED`、`SUCCEEDED`、`CANCELED`、`TIMED_OUT`、`REJECTED` 或 `REMOVED`）。

有关使用和不使用调度配置时的限制的更多信息，请参阅 [任务执行限制](job-limits.md#job-execution-limits)。

**NextNotification**
+ `NextNotification` 包含有关队列中下一个任务执行的摘要信息。

  每当列表中第一个任务执行更改时，则会发布 `NextNotification`。
  + 新的任务执行作为 `QUEUED` 添加到列表，并且在列表中排在第一位。
  + 不是列表中第一位的现有任务执行的状态从 `QUEUED` 更改为 `IN_PROGRESS`，然后成为列表中的第一个。（当列表中没有其它 `IN_PROGRESS` 任务执行时，或者当状态从 `QUEUED` 更改为 `IN_PROGRESS` 的任务执行排队的时间早于列表中其他所有 `IN_PROGRESS` 任务执行时，会出现这种情况。） 
  + 列表第一的任务执行状态更改为最终状态，并且从列表中删除。

有关发布和订阅 MQTT 主题的更多信息，请参阅 [设备通信协议](protocols.md)。

**注意**  
当您使用 HTTP Signature Version 4 或 HTTP TLS 与 Jobs 通信时，通知不可用。

## 任务待处理
<a name="jobs-comm-pending"></a>

在某事物的待处理任务执行列表中添加或从中删除任务或列表中的第一个任务执行发生变化时，Amazon IoT作业服务会在 MQTT 主题上发布一条消息：
+ `$aws/things/thingName/jobs/notify`
+ `$aws/things/thingName/jobs/notify-next`

消息包含以下示例有效载荷：

`$aws/things/thingName/jobs/notify`:

```
{
  "timestamp" : 10011,
  "jobs" : {
    "IN_PROGRESS" : [ {
      "jobId" : "other-job",
      "queuedAt" : 10003,
      "lastUpdatedAt" : 10009,
      "executionNumber" : 1,
      "versionNumber" : 1
    } ],
    "QUEUED" : [ {
      "jobId" : "this-job",
      "queuedAt" : 10011,
      "lastUpdatedAt" : 10011,
      "executionNumber" : 1,
      "versionNumber" : 0
    } ]
  }
}
```

如果名为 `this-job` 的任务执行源自某个选定了可选计划配置且任务文档推出计划在维护时段内进行的任务，则该任务只会在定期维护时段内出现。在维护时段之外，名为 `this-job` 的任务将从待处理的任务执行列表中排除，如以下示例所示。

```
{
  "timestamp" : 10011,
  "jobs" : {
    "IN_PROGRESS" : [ {
      "jobId" : "other-job",
      "queuedAt" : 10003,
      "lastUpdatedAt" : 10009,
      "executionNumber" : 1,
      "versionNumber" : 1
    } ],
    "QUEUED" : []
  }
}
```

`$aws/things/thingName/jobs/notify-next`:

```
{
  "timestamp" : 10011,
  "execution" : {
    "jobId" : "other-job",
    "status" : "IN_PROGRESS",
    "queuedAt" : 10009,
    "lastUpdatedAt" : 10009,
    "versionNumber" : 1,
    "executionNumber" : 1,
    "jobDocument" : {"c":"d"}
  }
}
```

如果名为 `other-job` 的任务执行源自某个选定了可选计划配置且任务文档推出计划在维护时段内进行的任务，则该任务只会在定期维护时段内出现。在维护时段之外，名为 `other-job` 的任务不会列为下一个任务执行，如以下示例所示。

```
{} //No other pending jobs
```

```
{
  "timestamp" : 10011,
  "execution" : {
      "jobId" : "this-job",
      "queuedAt" : 10011,
      "lastUpdatedAt" : 10011,
      "executionNumber" : 1,
      "versionNumber" : 0,
      "jobDocument" : {"a":"b"}
  }
} // "this-job" is pending next to "other-job"
```

可能的任务执行状态值为 `QUEUED`、`IN_PROGRESS`、`FAILED`、`SUCCEEDED`、`CANCELED`、`TIMED_OUT`、`REJECTED` 和 `REMOVED`。

以下一系列示例显示了在创建任务执行以及任务执行从一种状态更改为另一种状态时向每个主题发布的通知。

首先，创建了一个名为 `job1` 的任务。此通知发布到 `jobs/notify` 主题：

```
{
  "timestamp": 1517016948,
  "jobs": {
    "QUEUED": [
      {
        "jobId": "job1",
        "queuedAt": 1517016947,
        "lastUpdatedAt": 1517016947,
        "executionNumber": 1,
        "versionNumber": 1
      }
    ]
  }
}
```

此通知发布到 `jobs/notify-next` 主题：

```
{
  "timestamp": 1517016948,
  "execution": {
    "jobId": "job1",
    "status": "QUEUED",
    "queuedAt": 1517016947,
    "lastUpdatedAt": 1517016947,
    "versionNumber": 1,
    "executionNumber": 1,
    "jobDocument": {
      "operation": "test"
    }
  }
}
```

当创建另一个任务 (`job2`) 时，此通知将发布到 `jobs/notify` 主题：

```
{
  "timestamp": 1517017192,
  "jobs": {
    "QUEUED": [
      {
        "jobId": "job1",
        "queuedAt": 1517016947,
        "lastUpdatedAt": 1517016947,
        "executionNumber": 1,
        "versionNumber": 1
      },
      {
        "jobId": "job2",
        "queuedAt": 1517017191,
        "lastUpdatedAt": 1517017191,
        "executionNumber": 1,
        "versionNumber": 1
      }
    ]
  }
}
```

通知未发布到 `jobs/notify-next` 主题，因为队列中的下一个任务 (`job1`) 尚未更改。当 `job1` 开始执行时，其状态更改为 `IN_PROGRESS`。没有发布任何通知，因为任务列表和队列中的下一个任务尚未更改。

当添加第三个任务 (`job3`) 时，此通知将发布到 `jobs/notify` 主题：

```
{
  "timestamp": 1517017906,
  "jobs": {
    "IN_PROGRESS": [
      {
        "jobId": "job1",
        "queuedAt": 1517016947,
        "lastUpdatedAt": 1517017472,
        "startedAt": 1517017472,
        "executionNumber": 1,
        "versionNumber": 2
      }
    ],
    "QUEUED": [
      {
        "jobId": "job2",
        "queuedAt": 1517017191,
        "lastUpdatedAt": 1517017191,
        "executionNumber": 1,
        "versionNumber": 1
      },
      {
        "jobId": "job3",
        "queuedAt": 1517017905,
        "lastUpdatedAt": 1517017905,
        "executionNumber": 1,
        "versionNumber": 1
      }
    ]
  }
}
```

通知未发布到 `jobs/notify-next` 主题，因为队列中的下一个任务仍为 `job1`。

当 `job1` 完成后，其状态更改为 `SUCCEEDED`，此通知将发布到 `jobs/notify` 主题：

```
{
  "timestamp": 1517186269,
  "jobs": {
    "QUEUED": [
      {
        "jobId": "job2",
        "queuedAt": 1517017191,
        "lastUpdatedAt": 1517017191,
        "executionNumber": 1,
        "versionNumber": 1
      },
      {
        "jobId": "job3",
        "queuedAt": 1517017905,
        "lastUpdatedAt": 1517017905,
        "executionNumber": 1,
        "versionNumber": 1
      }
    ]
  }
}
```

此时，已从队列中删除 `job1`，要执行的下一个任务是 `job2`。此通知发布到 `jobs/notify-next` 主题：

```
{
  "timestamp": 1517186269,
  "execution": {
    "jobId": "job2",
    "status": "QUEUED",
    "queuedAt": 1517017191,
    "lastUpdatedAt": 1517017191,
    "versionNumber": 1,
    "executionNumber": 1,
    "jobDocument": {
      "operation": "test"
    }
  }
}
```

如果 `job3` 必须在 `job2` 之前开始执行（不推荐），`job3` 的状态可以更改为 `IN_PROGRESS`。更改后，`job2` 则不再是队列中的下一个任务，此通知将发布到 `jobs/notify-next` 主题：

```
{
  "timestamp": 1517186779,
  "execution": {
    "jobId": "job3",
    "status": "IN_PROGRESS",
    "queuedAt": 1517017905,
    "startedAt": 1517186779,
    "lastUpdatedAt": 1517186779,
    "versionNumber": 2,
    "executionNumber": 1,
    "jobDocument": {
      "operation": "test"
    }
  }
}
```

没有向 `jobs/notify` 主题发布任何通知，因为没有添加或删除任何任务。

如果设备拒绝 `job2`，并且将其状态更新为 `REJECTED`，则此通知将发布到 `jobs/notify` 主题：

```
{
  "timestamp": 1517189392,
  "jobs": {
    "IN_PROGRESS": [
      {
        "jobId": "job3",
        "queuedAt": 1517017905,
        "lastUpdatedAt": 1517186779,
        "startedAt": 1517186779,
        "executionNumber": 1,
        "versionNumber": 2
      }
    ]
  }
}
```

如果 `job3`（仍在进行）被强制删除，则此通知将发布到 `jobs/notify` 主题：

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

此时队列为空。此通知发布到 `jobs/notify-next` 主题：

```
{
  "timestamp": 1517189551
}
```