Expression cron de printemps pour tous les jours 1: 01: am


203

J'essaie de faire exécuter mon code selon un calendrier fixe, basé sur une expression cron Spring. Je souhaite que le code soit exécuté tous les jours à 1h01. J'ai essayé l'expression suivante, mais cela ne s'est pas déclenché pour moi. Quel est le problème avec la syntaxe ici?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}



mon expression cron 0 0 0 1 JAN MON travaillait jusqu'à l'année dernière. Le 1er janvier, arrêtez de travailler en disant une expression cron invalide. Bien que cela soit destiné à une fréquence très inférieure, nous avons pu exécuter le serveur tc. après le 1er janvier, cela n'a pas été le cas. Quand je suis passé à 0 0 7? * SOLEIL, il a commencé à fonctionner. Je suis curieux de savoir pourquoi 0 0 0 1 JAN MON a cessé de travailler là où c'était bien l'année dernière jan.
spandey

0 0 0 1 JAN MON peut être une expression erronée, eh bien, cela fonctionnait aussi et le serveur tc ne se plaignait jamais
spandey

Réponses:


574

Essayez avec:

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

Vous trouverez ci-dessous les exemples de modèles du forum du printemps:

* "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

L'expression Cron est représentée par six champs:

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

(*) signifie correspondre à tout

*/X signifie "chaque X"

?("pas de valeur spécifique") - utile lorsque vous devez spécifier quelque chose dans l'un des deux champs dans lesquels le caractère est autorisé, mais pas dans l'autre. Par exemple, si je veux que mon déclencheur se déclenche un jour particulier du mois (disons le 10), mais peu m'importe quel jour de la semaine qui se trouve, je mettrais "10" dans la journée - champ du mois et "?" dans le champ jour de la semaine.

PS: Pour le faire fonctionner, n'oubliez pas de l'activer dans votre contexte d'application: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- support d'annotation


15
Le format est également documenté au printemps lui-même ici - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx

1
Je suppose que Spring Cron est également capable de fournir des secondes, mais le cron Unix normal est basé sur les minutes ... comme dans les pages de manuel Unix, la minute est la plus petite unité de temps qui peut être configurée.
nanosoft

8
quelle est la signification du "?" personnage? S'applique-t-il uniquement au champ "jour (s) de la semaine"? Est-ce que cela fonctionnerait / ferait quelque chose de différent si nous remplacions le «? avec '*' dans l'exemple du jour de Noël?
encrest

1
@encrest jetez un œil ici: stackoverflow.com/questions/11499740/…
gipinani


90

Pour mon ordonnanceur, je l'utilise pour tirer à 6 h tous les jours et ma notation cron est:

0 0 6 * * *

Si vous voulez 1: 01: am, réglez-le sur

0 1 1 * * *

Code complet pour le planificateur

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

** TRÈS IMPORTANT

Pour être sûr de l'exactitude du temps de tir de votre planificateur, vous devez définir la valeur de zone comme ceci (je suis à Istanbul):

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

Vous pouvez trouver les valeurs de fuseau horaire complètes à partir d' ici .

Remarque: Ma version du framework Spring est: 4.0.7.


1
Je ne sais pas pourquoi votre réponse n'a que 12 même si c'est la seule bonne réponse ici!

2
Merci beaucoup @MoayadAbuJaber. Le score n'est pas important, si les développeurs sont en mesure de résoudre leurs problèmes avec mes réponses, c'est assez, applaudit.
Bahadir Tasdemir

puis-je utiliser la zone avec sheduler de configuration xml <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>??
shareef

3
bravo

2
Merci, @Forhad. Si vous êtes un développeur et que vous rencontrez l'un des problèmes liés aux dates et aux heures, vous devez connaître les détails des horodatages, des fuseaux horaires et des conversions. Sinon, vos données seront absurdes
Bahadir Tasdemir

22

Vous pouvez utiliser annoter votre méthode avec @Scheduled(cron ="0 1 1 * * ?").

0 - est pour les secondes

1 à 1 minute

1 - heure de la journée.


12

Quelque chose manque dans la réponse de Gipinani

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

Cela s'exécutera à 1.01 et 13.01. Il peut être utilisé lorsque vous devez exécuter le travail sans modèle plusieurs fois par jour.

Et l'attribut de zone est très utile lorsque vous effectuez des déploiements sur des serveurs distants. Cela a été introduit avec le printemps 4.


2
Notez que le support des abréviations (pour le fuseau horaire) est pour la compatibilité JDK 1.1.x uniquement et les noms complets doivent être utilisés - selon javadoc
slashron

6

J'ai remarqué une chose: le CronTrigger de printemps n'est pas le cron. Vous pouvez vous retrouver avec 7 paramètres dans une expression cron valide (que vous pouvez valider sur cronmaker.com) et ensuite ne pas l'accepter. La plupart des cas, vous venez de supprimer le dernier paramètre et tout fonctionne bien.


1
"CronTrigger n'est pas du Quartz"
Sandy Simonton

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.