本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
任务通知
当任务处于待处理状态或列表中的第一个任务执行发生变化时, AWS IoT 作业服务会向保留主题发布 MQTT 消息。设备可通过订阅这些主题来跟踪待处理任务。
任务通知类型。
任务通知将作为 JSON 负载发布到 MQTT 主题。通知有两种:
ListNotification
ListNotification
包含一个列表,其中待处理的任务执行不超过 15 个。它们依次按照状态(IN_PROGRESS
任务执行在 QUEUED
任务执行之前)和排队的时间进行排序。
如果满足以下条件之一,则发布 ListNotification
。
-
新的任务执行已排队或更改为非最终状态(
IN_PROGRESS
或QUEUED
)。 -
旧的任务执行更改为最终状态(
FAILED
、SUCCEEDED
、CANCELED
、TIMED_OUT
、REJECTED
或REMOVED
)。
列出通知(QUEUED 或 IN_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"
可能的任务执行状态值为 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 }