任務通知 - AWS IoT Core

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

任務通知

當 AWS IoT 工作擱置中或清單中的第一個工作執行變更時,Jobs 服務會將 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 第 4 版或 HTTP TLS 來與任務通訊時,通知無法使用。

任務待定

當 AWS 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 } ] } }

如果名為 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 }