Notificaciones de trabajos - AWS IoT Core

Notificaciones de trabajos

El servicio Jobs de AWS IoT publica mensajes de MQTT para temas reservados cuando los trabajos están pendientes o cuando cambia la primera ejecución del trabajo en la lista. Los dispositivos pueden realizar un seguimiento de los trabajos pendientes suscribiéndose a estos temas.

Tipos de notificaciones de trabajo

Las notificaciones de trabajo se publican en temas MQTT como cargas JSON. Existen dos tipos de notificaciones:

ListNotification

Una ListNotification contiene una lista de no más de 15 ejecuciones de trabajos pendientes. Se almacenan por estado (ejecuciones de trabajo IN_PROGRESS antes que las ejecuciones de trabajo QUEUED) y, a continuación, por las veces que se incluyeron en la cola.

Una ListNotification se publica siempre que se cumple uno de los siguientes criterios.

  • Se pone en cola una nueva ejecución de trabajo o se cambia a un estado no terminal (IN_PROGRESS o QUEUED).

  • Una ejecución de trabajo antigua cambia a un estado terminal (FAILED, SUCCEEDED, CANCELED, TIMED_OUT, REJECTED o REMOVED).

Notificación de lista (hasta 15 ejecuciones de trabajos pendientes en QUEUED o IN_PROGRESS)

Sin configuración de programación opcional ni periodo de mantenimiento periódico

(Hasta 10 ejecuciones de trabajos)

Con configuración de programación opcional y periodo de mantenimiento periódico

(Hasta 5 ejecuciones de trabajos)

Aparece siempre en ListNotification.

Solo aparece en ListNotification durante un periodo de mantenimiento.

NextNotification

  • NextNotification contiene información resumida sobre la ejecución del trabajo siguiente en la cola.

    Se publica una NextNotification siempre que cambia la ejecución del primer trabajo de la lista.

    • Se añade a la lista una nueva ejecución del trabajo como QUEUED y se coloca el primero en la lista.

    • El estado de la ejecución de un trabajo existente que no estaba en el primer lugar en la lista cambia de QUEUED a IN_PROGRESS y pasa a colocarse en primer lugar en la lista. (Esto sucede cuando no hay otras ejecuciones de trabajos de IN_PROGRESS en la lista o cuando la ejecución del trabajo cuyo estado cambia de QUEUED a IN_PROGRESS estaba en la cola antes que cualquier otra ejecución de trabajo de IN_PROGRESS de la lista.)

    • El estado de la ejecución del trabajo existente que se encuentra en el primer lugar de la lista cambia a un estado terminal y se quita de la lista.

Para obtener más información acerca de cómo publicar en temas de MQTT y suscribirse a ellos, consulte Protocolos de comunicación de dispositivos.

nota

Las notificaciones no están disponibles cuando se usa HTTP Signature Version 4 o HTTP TLS para comunicarse con trabajos.

Trabajo pendiente

El servicio Jobs de AWS IoT publica un mensaje en un tema de MQTT cuando se añade un trabajo a la lista de ejecuciones de trabajos pendientes para un objeto o se quita un trabajo de dicha lista, o cuando cambia la primera ejecución del trabajo en la lista:

  • $aws/things/thingName/jobs/notify

  • $aws/things/thingName/jobs/notify-next

Los mensajes contienen las siguientes cargas de ejemplo:

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

Si la ejecución del trabajo llamado this-job se originó en un trabajo con la configuración de programación opcional seleccionada y el despliegue del documento de trabajo está programado para realizarse durante un periodo de mantenimiento, solo aparecerá durante un periodo de mantenimiento periódico. Fuera del periodo de mantenimiento, el trabajo llamado this-job quedará excluido de la lista de ejecuciones de trabajos pendientes, como se muestra en el siguiente ejemplo.

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

Si la ejecución del trabajo llamado other-job se originó en un trabajo con la configuración de programación opcional seleccionada y el despliegue del documento de trabajo está programado para realizarse durante un periodo de mantenimiento, solo aparecerá durante un periodo de mantenimiento periódico. Fuera de un periodo de mantenimiento, el trabajo llamado other-job no figurará como la siguiente ejecución de trabajo, como se muestra en el siguiente ejemplo.

{} //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"

Los valores del estado de ejecución de trabajo posibles son QUEUED, IN_PROGRESS, FAILED, SUCCEEDED, CANCELED, TIMED_OUT, REJECTED y REMOVED.

La siguiente serie de ejemplos muestra las notificaciones publicadas en cada tema a medida que se crean las ejecuciones de trabajo y cambian de un estado a otro.

En primer lugar se crea un trabajo llamado job1. La notificación se publica en el tema jobs/notify:

{ "timestamp": 1517016948, "jobs": { "QUEUED": [ { "jobId": "job1", "queuedAt": 1517016947, "lastUpdatedAt": 1517016947, "executionNumber": 1, "versionNumber": 1 } ] } }

La notificación se publica en el tema jobs/notify-next:

{ "timestamp": 1517016948, "execution": { "jobId": "job1", "status": "QUEUED", "queuedAt": 1517016947, "lastUpdatedAt": 1517016947, "versionNumber": 1, "executionNumber": 1, "jobDocument": { "operation": "test" } } }

Cuando se crea otro trabajo (job2), esta notificación se publica en el tema 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 } ] } }

No se publica una notificación en el tema jobs/notify-next porque el siguiente trabajo de la cola (job1) no ha cambiado. Cuando job1 comienza a ejecutarse, su estado cambia a IN_PROGRESS. No se publican notificaciones ya que la lista de trabajos y el siguiente trabajo en la cola no han cambiado.

Cuando se añade un tercer trabajo (job3), esta notificación se publica en el tema 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 } ] } }

No se publica una notificación en el tema jobs/notify-next porque el siguiente trabajo en la cola sigue siendo job1.

Cuando job1 finaliza, su estado cambia a SUCCEEDED y se publica esta notificación en el tema 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 } ] } }

En este punto, job1 se ha eliminado de la cola y el siguiente trabajo que ejecutar es job2. La notificación se publica en el tema jobs/notify-next:

{ "timestamp": 1517186269, "execution": { "jobId": "job2", "status": "QUEUED", "queuedAt": 1517017191, "lastUpdatedAt": 1517017191, "versionNumber": 1, "executionNumber": 1, "jobDocument": { "operation": "test" } } }

Si job3 tiene que empezar a ejecutarse antes que job2 (lo cual no se recomienda), el estado de job3 puede cambiarse a IN_PROGRESS. Si esto sucede, job2 deja de ser el siguiente en la cola y se publica esta notificación en el tema jobs/notify-next:

{ "timestamp": 1517186779, "execution": { "jobId": "job3", "status": "IN_PROGRESS", "queuedAt": 1517017905, "startedAt": 1517186779, "lastUpdatedAt": 1517186779, "versionNumber": 2, "executionNumber": 1, "jobDocument": { "operation": "test" } } }

No se publica ninguna notificación en el tema jobs/notify, dado que no se ha añadido o eliminado ningún trabajo.

Si el dispositivo rechaza job2 y actualiza su estado a REJECTED, se publica esta notificación en el tema jobs/notify:

{ "timestamp": 1517189392, "jobs": { "IN_PROGRESS": [ { "jobId": "job3", "queuedAt": 1517017905, "lastUpdatedAt": 1517186779, "startedAt": 1517186779, "executionNumber": 1, "versionNumber": 2 } ] } }

Si job3 (que aún está en curso) se elimina de forma forzada, esta notificación se publica en el tema jobs/notify:

{ "timestamp": 1517189551, "jobs": {} }

En este momento, la cola está vacía. La notificación se publica en el tema jobs/notify-next:

{ "timestamp": 1517189551 }