Formato cron de Quartz
Una expresión de Quartz tiene seis o siete campos: segundos, minutos, horas, día del mes, mes, día de la semana y un año opcional. Por ejemplo, 0 0 12 ? * MON-FRI se dispara al mediodía los días laborables. Los días de la semana van de 1 (domingo) a 7 (sábado) y se aceptan nombres como MON o FRI, también en rangos.
La regla del signo de interrogación
Quartz no permite restringir a la vez el día del mes y el día de la semana. Exactamente uno de los dos campos debe contener «?», que significa «sin valor específico». Por eso 0 0 12 * * MON no es válido; escribe 0 0 12 ? * MON. El explicador lo señala al instante.
Caracteres especiales L, W y #
L significa «último»: L en el día del mes es el último día del mes, L-3 son tres días antes, y 6L en el día de la semana es el último viernes. W busca el día laborable más cercano a una fecha sin salir del mes, así que 15W se dispara el día laborable más próximo al 15, y LW es el último día laborable del mes. La almohadilla elige el enésimo día de la semana: 6#3 es el tercer viernes.
Quartz en la práctica
En código Java, una expresión de Quartz se asocia a un disparador, por ejemplo TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 ? * MON-FRI").inTimeZone(TimeZone.getTimeZone("Europe/Madrid"))). Sin inTimeZone se usa la zona predeterminada de la JVM. Las instrucciones de misfire deciden qué ocurre si el planificador estaba caído a la hora prevista: dispararse una vez ahora o saltar al siguiente hueco.
Preguntas frecuentes
- ¿En qué se diferencia el cron de Quartz del de Unix?
- Quartz añade un campo de segundos al principio y un año opcional al final, numera los días desde 1 = domingo, exige «?» en un campo de día y admite L, W y #.
- ¿Puedo convertir una expresión de Quartz a crontab?
- Sí, siempre que los segundos sean 0, no haya año y no se usen L, W ni #. El conversor muestra el equivalente en crontab o explica por qué no existe.
- ¿Qué significa 0 0/5 * * * ?
- Se dispara cada cinco minutos, en el segundo 0, empezando en el minuto 0 de cada hora, todos los días.
- ¿El cron de @Scheduled de Spring es igual que el de Quartz?
- Muy parecido, pero Spring numera el domingo como 0 o 7, no tiene campo de año y no exige «?». Usa la página de Spring para expresiones de Spring.