Ir al contenido

Queue

Versión: 1.2.9  ·  ID: zoan-packages-queue  ·  Autor: Zoan Software

El paquete Queue permite que los bots trabajen con las colas de trabajo de Zoan Cloud: listas de tareas pendientes que se procesan una a una, con bloqueo atómico, reintentos y prioridades. Es el patrón de RPA para procesar lotes grandes de forma robusta y en paralelo.

ActividadTipoSalidaQué hace
Add Queue Itemqueue-add-itemZoanQueueItemEncola un item nuevo con su payload; opcionalmente con una tarea humana que debe decidirse antes de procesarlo
Add Transaction Itemqueue-add-transaction-itemZoanQueueItemCrea un item y lo devuelve ya in_progress bloqueado (crear + procesar en el mismo run)
Get Queue Itemqueue-get-itemZoanQueueItemToma (y bloquea) el siguiente item; null si la cola está vacía
Process Queuequeue-process—Vacía la cola entera: toma cada item, corre tu lógica y reporta el resultado (el performer en una sola actividad)
Set Transaction Statusqueue-set-transaction-status—Marca un item como successful o failed
Postpone Transactionqueue-postpone-transaction—Devuelve el item a la cola y lo aplaza (sin contar el intento)

Las actividades Add Queue Item, Add Transaction Item y Get Queue Item devuelven un ZoanQueueItem, y Process Queue lo pone en la variable del item. Sus campos, accesibles desde expresiones:

CampoTipoPara qué
item.IdstringIdentificador único (UUID): lo necesitas para reportar el estado.
item.QueueIdstringId de la cola.
item.ReferencestringLa referencia que le dio el productor (null si no hubo).
item.StatusstringEstado actual: new, in_progress, successful, failed, business_exception, abandoned, retried, review o waiting_decision (esperando la decisión de su tarea humana).
item.SpecificContent["campo"]DictionaryEl payload: los datos que el bot debe procesar.
item.Prioritystringhigh, normal o low.
item.AttemptsintCuántos intentos se han hecho sobre este item (incluido el actual).
item.OutputDictionaryEl resultado guardado (si terminó con éxito); null si no hay.
item.ExceptionDictionaryEl detalle del error (si falló); null si no hay.
item.ProgressstringÚltimo mensaje de progreso reportado.
item.DeferUntilstringFecha (ISO 8601, UTC) antes de la cual no se entrega; null si no está aplazado.
item.ProcessingStartedAt / item.ProcessedAt / item.CreatedAtstringCuándo se empezó a procesar, cuándo terminó y cuándo se encoló (ISO 8601, UTC).
item.HumanTaskIdstringId de la tarea humana enlazada, si la tiene.
item.HasDecisionbooltrue si el item tenía una tarea humana enlazada y ya se decidió, venció o se canceló.
item.Decision.ValuestringLa opción elegida ("Aprobar", "Rechazar"…); vacía si venció o se canceló. También Decision.Status (completed, expired, cancelled), Decision.Comment, Decision.Fields["campo"], Decision.DecidedBy, Decision.DecidedAt y Decision.TaskId.

Por ejemplo, si encolaste el payload con un campo facturaId, dentro del performer lo lees así: item.SpecificContent["facturaId"].

Lo normal son dos playbooks (que publicas como dos procesos).

Recorre el origen de los datos y encola un item por cada unidad de trabajo. Suele lanzarse con un trigger programado.

Read Range archivo = "facturas.xlsx" → output: facturas
For Each item en = facturas.Rows
└─ body:
Add Queue Item
queueName = "facturas-por-validar"
reference = item["numero"]
specificContent = {
"facturaId": item["numero"],
"monto": = item["monto"]
}

La reference (opcional) hace el encolado idempotente: si vuelves a encolar la misma referencia, Zoan Cloud devuelve el item existente en vez de crear un duplicado. Útil si el dispatcher se ejecuta dos veces.

En un bucle, toma items hasta que la cola se vacía, procesa cada uno y reporta el resultado dentro de un Try / Catch.

While condition = true
└─ body:
Get Queue Item queueName = "facturas-por-validar" → output: item
If condition = item == null
└─ then: Break (la cola está vacía → salir del bucle)
Try
└─ body:
(… procesa = item.SpecificContent["facturaId"] …)
Set Transaction Status item = item status = successful
output = { "validada": true }
└─ catch (err):
Set Transaction Status item = item status = failed
exception = { "message": err.Message }