Programadores — /schedulers

Casi todo lo que el CMS hace sin que nadie se lo pida pasa por un programador: procesar los mensajes de una interfaz, buscar datos en una Recolección, verificar si las aplicaciones están en línea, purgar mensajes viejos. Esta pantalla los muestra todos en un solo lugar.
Un programador pausado es la causa más común de “la recolección dejó de traer datos”. Nada se
rompe, nada se convierte en error: los mensajes simplemente dejan de procesarse. Por eso existe un
tipo de alerta dedicado — AGENDADOR_PAUSADO — y un estado propio en el Panel de
Interfaces.
Dos tipos de programador
El listado separa los jobs en dos grupos, y la diferencia importa porque los permisos son distintos. Hay además un tercero, los Disparadores, descrito más abajo — a efectos de permiso se comporta como el de Interfaz.
Programadores de Sistema
Creados por el propio CMS en el primer arranque:
| Job | Qué hace | Por defecto |
|---|---|---|
keep-alive | Consulta el keep-alive de todas las aplicaciones y actualiza el estado ON/OFF | cada 10 segundos |
limpeza | Elimina mensajes y procesamientos más antiguos que la retención configurada en cada Interfaz | todos los días a las 2h |
Check-msg-acumulada-alert | Verifica interfaces con mensajes acumulados por encima del límite y dispara la alerta | cada minuto |
Check-chamado-atrasado | Abre un ticket para la Aplicación que pasó del tiempo offline configurado en la alerta | cada minuto |
Check-sap-cpi-processamento | Verifica en el SAP CPI si los iFlows que recibieron Entregas terminaron con éxito y dispara la alerta Falla en el iFlow. Sin conexión SAP CPI con API de gestión, no hace ninguna llamada | cada minuto |
resumo-diario | Cierra la Radiografía del día anterior y envía el resumen a los suscritos | todos los días a las 0h10 |
revisao-ia | Avisa a los revisores cuando hay sesiones de IA señaladas esperando revisión | todos los días a las 7h |
Solo los administradores ven y modifican los programadores de Sistema. Un usuario común ve únicamente los programadores de las Interfaces a las que tiene acceso.
Programadores de Interfaz
Uno por Interfaz registrada, nombrado fila-{SIGLA}. Es él quien ejecuta el ciclo de la interfaz:
buscar lo que hay que hacer, encolar y procesar. La pantalla agrupa esos jobs por Aplicación, con
conteo de activos e inactivos en cada grupo.
Crear una Interfaz crea el programador; renombrar la Interfaz renombra el job preservando el estado (un job apagado sigue apagado); eliminar la Interfaz elimina el job.
Una Interfaz creada por importación, por un asistente o por un Pack SAP ya nace con el programador registrado y corriendo — no hace falta reiniciar la API.
Las Interfaces de las herramientas de Help Desk aparecen en un grupo propio, Help Desk. Conviene revisarlo: con el programador de la Interfaz de una herramienta apagado, el ticket entra en la cola y no sale — en SAP PM, el aviso queda “Esperando” para siempre.
Disparadores
Uno por Disparador registrado, nombrado trigger-{id} y mostrado con el
nombre que la persona le dio. Quedan en un grupo propio, Disparadores, antes de Sistema, con el
destino (la Recolección o Entrega) y la programación en palabras en la fila.
Aquí se puede pausar, ejecutar ahora y ver el historial. Dos cosas son distintas de los programadores de Interfaz, a propósito:
- Activar no ocurre aquí. La activación de un Disparador pasa por una pregunta de confirmación que solo hace la pantalla de Disparadores — intentar activar desde esta pantalla muestra un aviso con el atajo hacia allá, y “Activar todos” salta los Disparadores y dice cuántos quedaron fuera.
- Editar la programación también es en la pantalla de Disparadores: el lápiz lleva allá. Las pestañas son las mismas, pero el Disparador guarda la elección entera en su registro — cambiarla solo en el job dejaría a los dos diciendo cosas distintas.
Cómo se elige la programación
El lápiz abre el mismo editor del registro de Disparador, con cinco pestañas:
| Pestaña | Qué define | Ejemplo |
|---|---|---|
| Cada | Cadencia corta, sin horario fijo | cada 5 segundos |
| Diario | Un horario por día, con opción de solo días hábiles | 07:30, de lunes a viernes |
| Semanal | Días marcados y horario | martes y jueves, 06:00 |
| Mensual | Día del mes (1 a 28) y horario | día 5, 23:00 |
| Avanzado | La expresión cron, para lo que las pestañas no cubren | 0 0 2 15,30 * * |
La pantalla muestra la elección en palabras y las próximas tres ejecuciones, en la zona horaria del servidor, antes de guardar. Una programación que el destino no puede cumplir aparece como error ahí mismo, en lugar de convertirse en un job que nunca dispara.
No es la pantalla la que arma la expresión: ella manda la elección y el servidor convierte, con la misma regla que usa el Disparador. Por eso las dos pantallas nunca discrepan sobre qué significa “cada 15 minutos”.
Los milisegundos solo aparecen para Interfaz. Una Interfaz guarda la cadencia corta como intervalo (es lo que permite 200 ms), mientras que los programadores internos del Sistema solo saben guardar cron — y cron no tiene lugar para una fracción de segundo.
El CMS acepta cron con segundos (seis campos). Es lo que permite 0/10 * * * * * en el keep-alive.
Dos cosas que la pantalla rechaza, y por qué
- “Último día del mes” existe en el Disparador y no aquí. No es solo una expresión: es un cron que dispara del día 28 al 31 más una marca que descarta los tres primeros, y esa marca solo la guarda el registro del Disparador. Aceptarla aquí programaría cuatro ejecuciones en lugar de una.
- En un programador del Sistema, “cada N” solo pasa cuando N divide la unidad de arriba en partes iguales (5, 10, 15, 30 segundos — no 45). Un paso de 45 segundos dispararía a los :00 y :45 y luego esperaría 15 s: la pantalla diría una cosa y el sistema haría otra.
Una Interfaz guardada en modo cron con expresión de cadencia (*/5 * * * * *) abre en la pestaña
Cada y, al guardar, pasa a guardarse como intervalo. Es la misma programación — e intervalo
es el modo que el CMS usa para Interfaz por debajo de un minuto —, pero la fila cambia de modo aun
sin que toques los campos.
Un intervalo muy corto en una Recolección significa consultar el origen muy cerca del tiempo real — y un origen lento puede acumular ejecuciones. Empiece conservador y ajuste después de medir el tiempo medio en el Monitor de Mensajes.
Qué se puede hacer en la pantalla
| Acción | Efecto |
|---|---|
| Activar / desactivar | Enciende o detiene el job. Vale de inmediato, sin reiniciar nada |
| Editar programación | Abre las cinco pestañas, con la frase legible y las próximas ejecuciones |
| Ejecutar ahora | Dispara una ejecución fuera del horario, para prueba |
| Historial | Últimas ejecuciones de ese job, con inicio, duración, estado y mensaje |
También hay acciones en lote: activar o desactivar todos los programadores de una Aplicación, o solo los seleccionados. Desactivar en lote pide confirmación escrita — es una acción que detiene la integración entera de una aplicación.
La columna Frecuencia dice la programación en una frase — “Cada 1 hora”, “Cada 5 minutos”, “Días hábiles a las 07:30” —, la misma de la pantalla de Disparadores. Cuando el valor grabado es una expresión cron, aparece pequeña justo debajo, para verificación; un intervalo no tiene expresión, la frase ya es el valor exacto.
La columna Ejecutando muestra, en tiempo real, cuáles interfaces tienen un mensaje en procesamiento en este momento.
Historial y diagnóstico
Cada ejecución graba inicio, duración, estado (Éxito o Error), mensaje y los IDs de los mensajes involucrados. El historial completo, con filtros por job, estado y período, está en Log de Programadores — incluso un gráfico de ejecuciones por hora, que suele ser la forma más rápida de ver “se detuvo a las 14h”.
Las ejecuciones sin nada que hacer no generan registro. En un job de intervalo, eso significa que “última ejecución” puede estar vieja aun con el job sano — simplemente no tuvo trabajo.
Permiso
La Herramienta es /schedulers. Un usuario no administrador solo ve (y solo puede modificar)
programadores de Interfaces que consten en sus Interfaces permitidas — los jobs de Sistema quedan
fuera de su alcance, incluso en las acciones en lote.