

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

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

當AWS 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 第 4 版或 HTTP TLS 來與任務通訊時，通知無法使用。

## 任務待定
<a name="jobs-comm-pending"></a>

當任務新增至物件的待定任務執行清單中或從清單中的第一個任務執行變更中移除時，AWS 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
}
```