Formato cron de Spring
Una expresión de Spring tiene seis campos: segundo, minuto, hora, día del mes, mes y día de la semana; por ejemplo 0 0 9 * * MON-FRI para las 09:00 de los días laborables. El domingo puede escribirse 0, 7 o SUN. Desde Spring Framework 5.3 el analizador entiende también L, W y # en los campos de día, además de macros como @hourly y @daily.
Zona horaria de @Scheduled
Por defecto, las expresiones se evalúan en la zona horaria predeterminada del servidor. Define el atributo zone, por ejemplo @Scheduled(cron = "0 0 2 * * *", zone = "Europe/Madrid"), para que la programación no dependa del host. Elige la misma zona en la herramienta para previsualizar las ejecuciones.
Spring frente a Quartz
Las expresiones de Spring se parecen a las de Quartz, pero cambian detalles: no hay campo de año, el domingo es 0 y no 1, y «?» se acepta pero no es obligatorio. Cuando ambos campos de día están restringidos, Spring exige que coincidan los dos. El conversor muestra el equivalente de Quartz cuando existe.
Activar la planificación
Los métodos con cron solo se ejecutan si activas la planificación con @EnableScheduling. Por defecto Spring usa un único hilo, así que una tarea larga retrasa a todas las demás; configura un ThreadPoolTaskScheduler o spring.task.scheduling.pool.size si tienes varias. En un clúster, cada instancia dispara el mismo cron: usa un bloqueo como ShedLock si una tarea debe ejecutarse una sola vez.
Preguntas frecuentes
- ¿Por qué Spring dice que la expresión debe tener seis campos?
- Spring necesita un campo de segundos. Antepón 0 a una expresión de crontab de cinco campos: 0 */5 * * * * se ejecuta cada cinco minutos.
- ¿Cómo desactivo una tarea @Scheduled con cron?
- Usa el valor especial "-" (Scheduled.CRON_DISABLED), normalmente mediante un marcador de propiedad.
- ¿Spring admite el último día del mes?
- Sí, desde la 5.3: 0 0 0 L * * se ejecuta a medianoche el último día de cada mes.
- ¿Puedo leer la expresión cron desde la configuración?
- Sí, por ejemplo @Scheduled(cron = "${jobs.cleanup.cron}"), para que la programación cambie según el entorno.