Espressione cron di primavera per ogni giorno 1: 01: am


203

Sto cercando di far eseguire il mio codice secondo una pianificazione fissa, basata su un'espressione cron di Spring. Vorrei che il codice venisse eseguito ogni giorno all'01: 01. Ho provato la seguente espressione, ma questo non mi è venuto in mente. Cosa c'è che non va nella sintassi qui?

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



my cron expression 0 0 0 1 JAN MON lavorava fino all'anno scorso. 1 ° gennaio in poi smettere di funzionare dicendo espressione cron non valida. Sebbene questo fosse destinato a una frequenza molto inferiore, ma siamo stati in grado di eseguire il server TC. dopo il 1 gennaio non lo ha fatto. Quando sono passato a 0 0 7? * SUN ha iniziato a funzionare. Sono curioso di sapere perché 0 0 0 1 JAN MON ha smesso di funzionare dove è andato bene lo scorso anno.
spandey,

0 0 0 1 JAN MON potrebbe essere un'espressione sbagliata, bene anche in questo funzionava e il server tc non si lamentava mai
spandey

Risposte:


574

Prova con:

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

Di seguito puoi trovare gli schemi di esempio nel forum di 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

L'espressione cron è rappresentata da sei campi:

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

(*) significa abbinare qualsiasi

*/X significa "ogni X"

?("nessun valore specifico"): utile quando è necessario specificare qualcosa in uno dei due campi in cui è consentito il carattere, ma non l'altro. Ad esempio, se voglio che il grilletto venga attivato in un determinato giorno del mese (diciamo, il 10), ma non mi interessa quale giorno della settimana si verifichi, metterei "10" nel giorno- campo del mese e "?" nel campo del giorno della settimana.

PS: per farlo funzionare, ricordati di abilitarlo nel tuo contesto applicativo: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- annotation-support


15
Il formato è anche documentato nella stessa primavera qui - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx,

1
Immagino che Spring Cron sia in grado di fornire anche secondi, ma il normale cron di unix è basato sui minuti ... come nelle pagine man di unix, il minuto è la più piccola unità di tempo che può essere configurata.
nanosoft,

8
qual è il significato del "?" carattere? Si applica solo al campo "giorno / i della settimana"? Funzionerebbe / farebbe qualcosa di diverso se sostituissimo "?" con '*' nell'esempio del giorno di Natale?
Encrest il

1
@encrest dare un'occhiata qui: stackoverflow.com/questions/11499740/...
gipinani


90

Per il mio programmatore, lo sto usando per sparare alle 6 del mattino ogni giorno e la mia cronologia è:

0 0 6 * * *

Se si desidera 1: 01: am quindi impostarlo su

0 1 1 * * *

Codice completo per lo scheduler

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

** MOLTO IMPORTANTE

Per essere sicuri della correttezza del tempo di accensione del tuo programmatore, devi impostare un valore di zona come questo (io sono a Istanbul):

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

Puoi trovare i valori completi del fuso orario da qui .

Nota: la versione di My Spring Framework è: 4.0.7.RELEASE


1
Non so perché la tua risposta ne abbia solo 12, anche se è l'unica risposta corretta qui!

2
Grazie mille @MoayadAbuJaber. Il punteggio non è importante, se gli sviluppatori sono in grado di risolvere i loro problemi con le mie risposte è sufficiente, evviva.
Bahadir Tasdemir

posso usare la zona con xml config sheduler <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>??
Shareef,

3
pollice in alto per menzionare il fuso orario
Forhad,

2
Grazie @Fhadhad. Se sei uno sviluppatore e stai affrontando uno dei problemi relativi alle date e agli orari, devi conoscere i dettagli di data e ora, fusi orari e conversioni. Altrimenti, i tuoi dati saranno senza senso
Bahadir Tasdemir il

22

Puoi usare annota il tuo metodo con @Scheduled(cron ="0 1 1 * * ?").

0 - è per secondi

1- 1 minuto

1 - ora del giorno.


12

Manca qualcosa dalla risposta di Gipinani

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

Questo verrà eseguito a 1.01 e 13.01. Può essere utilizzato quando è necessario eseguire il lavoro senza uno schema più volte al giorno.

E l'attributo zone è molto utile quando si eseguono distribuzioni in server remoti. Questo è stato introdotto con la primavera 4.


2
Si noti che il supporto delle abbreviazioni (per il fuso orario) è solo per la compatibilità con JDK 1.1.x e devono essere usati nomi completi - come da javadoc
slashron,

6

Una cosa che ho notato è: Spring CronTrigger non è cron. Puoi finire con 7 parametri in un'espressione cron valida (che puoi validare su cronmaker.com) e poi non accettarla. La maggior parte dei casi elimina solo l'ultimo parametro e tutto funziona bene.


1
"CronTrigger non è quarzo"
Sandy Simonton,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.