

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ジョブの通知
<a name="jobs-comm-notifications"></a>

AWS IoTJobs サービスは、ジョブが保留中の場合、またはリストの最初のジョブ実行が変更された場合、予約済みトピックに MQTT メッセージを発行します。デバイスでは、これらのトピックにサブスクライブすることによって、保留中のジョブを追跡できます。

## ジョブ通知タイプ
<a name="jobs-comm-notifications-types"></a>

ジョブ通知は、MQTT トピックに JSON ペイロードとして発行されます。通知は 2 種類あります。

**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 署名バージョン 4 あるいは HTTP TLS を使用する場合、通知は利用できません。

## ジョブの保留
<a name="jobs-comm-pending"></a>

AWS IoTJobs サービスは、モノの保留中のジョブ実行のリストからジョブが追加または削除されるか、リスト内の最初のジョブ実行が変更されると、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` です。

以下の一連の例では、ジョブ実行が作成、および 1 つの状態から別の状態に変更される各トピックに発行される通知を示しています。

まず、`job1` という名の 1 つのジョブが作成されます。この通知は、`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` に変わります。ジョブのリストおよびキューの次のジョブが変更されないため、通知は発行されません。

3 番目のジョブが追加されると (`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
}
```