Spring cron expresión para todos los días 1: 01: am

203

Estoy tratando de ejecutar mi código en un horario fijo, basado en una expresión cron de Spring. Me gustaría que el código se ejecute todos los días a la 1: 01 am. Intenté la siguiente expresión, pero esto no me funcionó. ¿Qué hay de malo con la sintaxis aquí?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
d-man
fuente
mi expresión cron 0 0 0 1 JAN MON estuvo trabajando hasta el año pasado. El 1 de enero en adelante deja de funcionar diciendo expresiones cron inválidas. Aunque esto estaba destinado a una frecuencia muy inferior, pudimos ejecutar el servidor tc. después del 1 de enero no fue así. Cuando cambié a 0 0 7? * SOL comenzó a funcionar. Tengo curiosidad por saber por qué 0 0 0 1 JAN MON dejó de funcionar donde estaba bien en el año pasado enero.
spandey
0 0 0 1 JAN MON puede ser una expresión incorrecta, bueno, en esto también estaba funcionando y el servidor tc nunca se quejó
spandey

Respuestas:

574

Probar con:

@Scheduled(cron = "0 1 1 * * ?")

A continuación puede encontrar los patrones de ejemplo del foro de primavera:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

La expresión de Cron está representada por seis campos:

second, minute, hour, day of month, month, day(s) of week

(*) significa coincidir con cualquier

*/X significa "cada X"

?("sin valor específico"): útil cuando necesita especificar algo en uno de los dos campos en los que se permite el carácter, pero no en el otro. Por ejemplo, si quiero que mi gatillo se active en un día particular del mes (por ejemplo, el 10), pero no me importa qué día de la semana sea, pondría "10" en el día. de campo mensual y "?" en el campo del día de la semana.

PD: para que funcione, recuerde habilitarlo en el contexto de su aplicación: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- soporte de anotación

gipinani
fuente
15
El formato también se documenta en la propia primavera aquí: docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx
1
Supongo que Spring Cron también puede proporcionar la provisión de segundos, pero el cron normal de Unix se basa en minutos ... como en las páginas de manual de Unix, el minuto es la unidad de tiempo más pequeña que se puede configurar.
nanosoft
8
¿Cuál es el significado del "?" ¿personaje? ¿Solo se aplica al campo "día (s) de la semana"? ¿Funcionaría / haría algo diferente si reemplazáramos el '?' con '*' en el ejemplo del día de Navidad?
encierro
1
@encrest echa un vistazo aquí: stackoverflow.com/questions/11499740/…
gipinani
90

Para mi programador, lo estoy usando para disparar a las 6 am todos los días y mi notación cron es:

0 0 6 * * *

Si quieres 1: 01: am, configúralo en

0 1 1 * * *

Código completo para el planificador

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** MUY IMPORTANTE

Para estar seguro acerca de la corrección del tiempo de disparo de su programador, debe establecer el valor de la zona de esta manera (estoy en Estambul):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

Puede encontrar los valores completos de la zona horaria desde aquí .

Nota: Mi versión de Spring Framework es: 4.0.7.

Bahadir Tasdemir
fuente
1
¡No sé por qué tu respuesta solo tiene 12, incluso es la única respuesta correcta aquí!
2
Muchas gracias @MoayadAbuJaber. El puntaje no es importante, si los desarrolladores pueden solucionar sus problemas con mis respuestas, es suficiente, saludos.
Bahadir Tasdemir
¿Puedo usar zone con el programador de configuración xml <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>?
shareef
3
aprobado por mencionar la zona horaria
Forhad
2
Gracias, @Forhad. Si usted es un desarrollador y está lidiando con alguno de los problemas relacionados con las fechas y horas, debe conocer los detalles de las marcas de tiempo, las zonas horarias y las conversiones. De lo contrario, sus datos no tendrán sentido
Bahadir Tasdemir
22

Puede usar anotar su método con @Scheduled(cron ="0 1 1 * * ?") .

0 - es por segundos

1- 1 minuto

1 hora del día.

user3298173
fuente
12

Algo falta en la respuesta de gipinani

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

Esto se ejecutará en 1.01 y 13.01. Se puede usar cuando necesita ejecutar el trabajo sin un patrón varias veces al día.

Y el atributo de zona es muy útil cuando realiza implementaciones en servidores remotos. Esto se introdujo con la primavera 4.

Maleen Abewardana
fuente
2
Tenga en cuenta que el soporte de abreviaturas (para zona horaria) es solo para compatibilidad con JDK 1.1.x y los nombres completos deben usarse, según javadoc
slashron el
6

Una cosa que he notado es: spring CronTrigger no es cron. Puede terminar con 7 parámetros en una expresión cron válida (que puede validar en cronmaker.com) y luego no aceptarla. La mayoría de los casos simplemente eliminas el último parámetro y todo funciona bien.

Irlan Cidade
fuente
1
"CronTrigger no es Cuarzo"
Sandy Simonton