任务通知 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

任务通知

当任务待处理或列表中的第一个任务执行更改时,Amazon IoT Jobs 服务将向保留主题发布 MQTT 消息。设备可通过订阅这些主题来跟踪待处理任务。

任务通知类型。

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

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

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

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

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

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

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

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

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

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

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

注意

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

任务待处理

当某个事物的待处理任务执行列表中添加或删除了任务时,或者列表中的第一个任务执行更改时,Amazon IoT Jobs 服务会在 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 } ] } }

$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"} } }

可能的任务执行状态值为 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 }