任务通知 - AWS IoT Core

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

任务通知

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

任务通知类型。

任务通知将作为 JSON 负载发布到 MQTT 主题。通知有两种:

ListNotification

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

如果满足以下条件之一,则发布 ListNotification

  • 新的任务执行已排队或更改为非最终状态(IN_PROGRESSQUEUED)。

  • 旧的任务执行更改为最终状态(FAILEDSUCCEEDEDCANCELEDTIMED_OUTREJECTEDREMOVED)。

列出通知(QUEUEDIN_PROGRESS 中待处理的任务执行不超过 15 个)

没有可选的计划配置和定期维护时段

(最多 10 个任务执行)

具有可选的计划配置和定期维护时段

(最多 5 个任务执行)

总是出现在 ListNotification.

仅在维护 ListNotification 时段内出现在中。

NextNotification

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

    每当列表中第一个任务执行更改时,则会发布 NextNotification

    • 新的任务执行作为 QUEUED 添加到列表,并且在列表中排在第一位。

    • 不是列表中第一位的现有任务执行的状态从 QUEUED 更改为 IN_PROGRESS,然后成为列表中的第一个。(当列表中没有其它 IN_PROGRESS 任务执行时,或者当状态从 QUEUED 更改为 IN_PROGRESS 的任务执行排队的时间早于列表中其他所有 IN_PROGRESS 任务执行时,会出现这种情况。)

    • 列表第一的任务执行状态更改为最终状态,并且从列表中删除。

有关发布和订阅 MQTT 主题的更多信息,请参阅 设备通信协议

注意

当您使用 HTTP Signature Version 4 或 HTTP TLS 与 Jobs 通信时,通知不可用。

任务待处理

在某事物的待处理任务执行列表中添加或从中删除任务或列表中的第一个任务执行发生变化时, 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"

可能的任务执行状态值为 QUEUEDIN_PROGRESSFAILEDSUCCEEDEDCANCELEDTIMED_OUTREJECTEDREMOVED

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

首先,创建了一个名为 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 }