Ejecuciones, historial y avisos#
Cada vez que una tarea programada se ejecuta, a su hora o a mano, queda una ejecución en el historial con su resultado y sus pasos. Esta página explica cómo leer el historial, cómo detener una ejecución en marcha, cómo recibir avisos por correo y qué pasa con varias instancias del servidor.
Antes de empezar#
- Ve las ejecuciones de los tipos de tarea que gestiona: los recálculos de libros con Administración de libros; los grupos y los procedimientos, con Administración del sistema. En las conexiones restringidas, solo quien administra el metadata.
- Los avisos por correo necesitan un servidor de correo (véase Configuración y Correo).
El historial#
Últimas ejecuciones, en Planificación, da las de la conexión; Ejecuciones, en el detalle de una tarea, las suyas. Cada fila tiene:
| Columna | Qué muestra |
|---|---|
| Inicio | Cuándo empezó. |
| Tarea | La tarea (solo en el historial de la conexión). |
| Por | Programada o A mano, y en nombre de quién. |
| Resultado | El estado, con su icono. |
| Duración | Lo que tardó o lo que lleva. |


Despliegue una ejecución para ver sus pasos: Procedimiento previo, cada Libro (con sus intentos) o Documento, Procedimiento y Procedimiento posterior, cada uno con su resultado y su mensaje.
| Resultado | Qué significa |
|---|---|
| En marcha | Se está ejecutando. |
| Bien | Terminó bien. Un recálculo sin documentos que conserven datos termina bien diciéndolo: «Ningún documento del libro conserva datos: no hay nada que recalcular». |
| Error | Falló. El mensaje del paso dice por qué. |
| No se hizo | Le tocaba, pero la ejecución anterior seguía en marcha: no se solapan. El mensaje dice cuál sigue en marcha y en qué instancia. Se avisa como un error. |
| Detenida | Alguien la detuvo («Detenida por «login»»). No es un fallo. |
El historial se conserva 90 días (ecenter.scheduling.history) y cada ejecución queda también en la auditoría como Ejecución programada, con el canal Tarea programada y la referencia sch-run:<ejecución>. Para ver todo lo que calculó una ejecución (sus consultas, sus trabajos), abra su entrada en la auditoría y pulse Incluir junto al canal (véase Buscar, filtrar y exportar).
Ejecutar ahora#
Ejecutar ahora, en el detalle de una tarea, la lanza en el momento, en su nombre, sin esperar turno y sin cambiar su siguiente ejecución. Si ya está en marcha, no se lanza otra (409: «La tarea '…' ya está en marcha»).
Detener una ejecución#
- Abra la tarea en marcha y pulse Detener….
- Lea lo que pasará y confirme con Detener:
- un procedimiento: «Se cancela la llamada al procedimiento en la base de datos, que deshace lo que no había confirmado»;
- un grupo: «Se cancelan los libros que se están recalculando y no se llama al procedimiento posterior»;
- un recálculo: «Se cancelan los documentos que se están recalculando».
La ejecución termina como Detenida, a su nombre. Los libros ya recalculados se quedan recalculados, y lo que un procedimiento hubiera confirmado por su cuenta queda hecho. Si terminó justo antes de que llegara la petición, queda bien («(se pidió detenerla cuando ya terminaba)»). Queda en la auditoría como Ejecución programada detenida, con en nombre de quién corría.
Con varias instancias, la detiene la instancia que la tiene en marcha: enseguida si es la que recibe la petición y, si es otra, en su siguiente vuelta (unos segundos).
Avisos por correo#
El planificador puede avisar por correo del resultado de cada ejecución. Se configura en el servidor:
| Propiedad | Por defecto | Qué es |
|---|---|---|
ecenter.scheduling.notifications.mode |
NONE |
NONE: no se avisa. ALL: todas las ejecuciones. FAILURES: las que fallan o no se hicieron (una detenida a mano no es un fallo). |
ecenter.scheduling.notifications.recipients |
(ninguno) | Las direcciones. Sin destinatarios no se avisa. |
ecenter.scheduling.notifications.from |
ecenter.notifications.from |
El remitente. |
ECENTER_SCHEDULING_NOTIFICATIONS_MODE=FAILURES
ECENTER_SCHEDULING_NOTIFICATIONS_RECIPIENTS=sistemas@example.org
El asunto dice el resultado, la tarea y la conexión: «[Empowerment Center] Falló «Cierre comercial diario» (Demo · Distribuciones Ibéricas)», o «Terminó», «No se ejecutó», «Se detuvo». El cuerpo da la tarea y su tipo, la conexión, en nombre de quién (o quién la ejecutó a mano), el inicio, el fin, la duración, el resultado y cada paso con su resultado, sus intentos y su mensaje.
La alerta de tareas que fallan seguidas#
Aunque no haya avisos por correo, la consola de operación abre la alerta Tarea programada que falla seguida cuando una tarea activa falla sus últimas 3 ejecuciones seguidas (ecenter.operations.alerts.scheduled-failures), con su nombre, su tipo, su conexión y el último motivo. Las no hechas y las detenidas a mano no cuentan ni cortan la racha. Se resuelve sola cuando la tarea termina bien, se desactiva o se elimina. Véase Alertas operativas.
Varias instancias#
ECenter está pensado para una instancia, pero la planificación funciona igual con varias:
- Solo una instancia revisa las tareas a la vez, con un bloqueo en la BD propia, y cada tarea la lanza la que consigue pasarla a su siguiente ejecución. No se ejecuta dos veces.
- Una sola ejecución en marcha por tarea, también entre instancias: lo garantiza la BD. A su hora, una ejecución que coincide con otra en marcha queda como No se hizo.
- Cada ejecución sabe de qué instancia es (
ECENTER_INSTANCE_NAME). Al arrancar, cada instancia da por interrumpidas solo las suyas que quedaron en marcha; las de otra siguen, porque son suyas.
Importante
Dé a cada instancia un nombre fijo con ECENTER_INSTANCE_NAME (deploy/compose.yaml pone ecenter-1). Si una instancia se retira para siempre con ejecuciones en marcha, esas ejecuciones bloquean su tarea hasta que arranque una instancia con el mismo nombre, que las da por interrumpidas.
Lanzar una tarea desde otro sistema#
Un proceso externo (un ETL que termina, un orquestador) puede lanzar una tarea por la API REST, con una sesión de la aplicación de un usuario que tenga el privilegio de su tipo: inicia sesión en POST /api/auth/login y envía la cookie de sesión y la cabecera X-XSRF-TOKEN (que da GET /api/auth/csrf), como el frontal. La planificación no tiene credenciales de servicio.
| Petición | Qué hace |
|---|---|
POST /api/scheduled-tasks/{id}/run |
Ejecutar ahora: 202 con la ejecución; 409 si ya está en marcha. |
GET /api/scheduled-runs/{id} |
El estado de una ejecución con sus pasos. |
POST /api/scheduled-runs/{id}/stop |
Detener: 202; 409 si ya había terminado. |
Configuración#
| Propiedad | Por defecto | Qué es |
|---|---|---|
ecenter.scheduling.enabled |
true |
false: no se lanza nada a su hora (Ejecutar ahora sigue) |
ecenter.scheduling.tick |
15s |
Cada cuánto se revisan las tareas |
ecenter.scheduling.zone |
la del servidor | La zona horaria de las programaciones, por ejemplo Europe/Madrid |
ecenter.scheduling.max-running |
4 |
Tareas en marcha a la vez en una instancia |
ecenter.scheduling.recalc-timeout |
2h |
Cada intento de recalcular un libro |
ecenter.scheduling.procedure-timeout |
2h |
Un procedimiento programado |
ecenter.scheduling.step-timeout |
30m |
El procedimiento previo o el posterior de un grupo |
ecenter.scheduling.history |
90d |
Lo que se conserva el historial |
ecenter.scheduling.instance-name |
ECENTER_INSTANCE_NAME o el nombre del equipo |
La instancia de cada ejecución |
ecenter.scheduling.notifications.* |
NONE |
Los avisos por correo (arriba) |