Frühlings-Cron-Ausdruck für jeden Tag 1: 01: am

202

Ich versuche, meinen Code nach einem festen Zeitplan ausführen zu lassen, der auf einem Spring-Cron-Ausdruck basiert. Ich möchte, dass der Code jeden Tag um 01:01 Uhr ausgeführt wird. Ich habe den folgenden Ausdruck ausprobiert, aber das hat für mich nicht ausgelöst. Was ist hier falsch an der Syntax?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
D-Mann
quelle
Mein Cron-Ausdruck 0 0 0 1 JAN MON arbeitete bis letztes Jahr. Ab dem 1. Januar hören Sie auf zu arbeiten und sagen einen ungültigen Cron-Ausdruck. Dies war zwar für eine sehr geringe Frequenz gedacht, aber wir konnten tc server ausführen. nach dem 1. Januar nicht. Wann habe ich auf 0 0 7 gewechselt? * SON es fing an zu arbeiten. Ich bin neugierig zu wissen, warum 0 0 0 1 JAN MON aufgehört hat zu arbeiten, wo es im Januar letzten Jahres gut war.
Spandey
0 0 0 1 JAN MON kann ein falscher Ausdruck sein, auch hier hat es funktioniert und der TC-Server hat sich nie beschwert
Spandey

Antworten:

573

Versuche es mit:

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

Unten finden Sie die Beispielmuster aus dem Frühlingsforum:

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

Der Cron-Ausdruck wird durch sechs Felder dargestellt:

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

(*) bedeutet Übereinstimmung mit jedem

*/X bedeutet "jedes X"

?("kein bestimmter Wert") - nützlich, wenn Sie in einem der beiden Felder, in denen das Zeichen zulässig ist, etwas angeben müssen, im anderen jedoch nicht. Wenn ich zum Beispiel möchte, dass mein Abzug an einem bestimmten Tag des Monats (z. B. am 10.) ausgelöst wird, es mir aber egal ist, welcher Wochentag gerade ist, würde ich "10" in den Tag setzen. Monatsfeld und "?" im Feld Wochentag.

PS: Damit es funktioniert, müssen Sie es in Ihrem Anwendungskontext aktivieren: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- Annotation-Unterstützung

gipinani
quelle
15
Das Format ist auch im Frühjahr selbst hier dokumentiert - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx
1
Ich denke, Spring Cron kann auch Sekunden bereitstellen, aber normales Unix Cron basiert auf Minuten ... wie auf Unix-Manpages ist Minute die kleinste Zeiteinheit, die konfiguriert werden kann.
Nanosoft
8
Welche Bedeutung hat das "?" Charakter? Gilt das nur für das Feld "Wochentag (e) der Woche"? Würde es funktionieren / etwas anderes machen, wenn wir das 'ersetzen würden?' mit '*' im Beispiel für den Weihnachtstag?
Encrest
1
@encrest werfen Sie einen Blick hier: stackoverflow.com/questions/11499740/…
gipinani
90

Für meinen Planer benutze ich es, um jeden Tag um 6 Uhr morgens zu feuern, und meine Cron-Notation lautet:

0 0 6 * * *

Wenn Sie 1: 01: am möchten, stellen Sie es auf ein

0 1 1 * * *

Vollständiger Code für den Scheduler

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

** SEHR WICHTIG

Um sicherzugehen, dass Ihr Scheduler die Zündzeit korrekt ist, müssen Sie den Zonenwert wie folgt einstellen (ich bin in Istanbul):

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

Die vollständigen Zeitzonenwerte finden Sie hier .

Hinweis: Meine Spring Framework-Version lautet: 4.0.7.RELEASE

Bahadir Tasdemir
quelle
1
Ich weiß nicht, warum Ihre Antwort nur 12 hat, obwohl es hier die einzig richtige Antwort ist!
2
Vielen Dank @MoayadAbuJaber. Die Punktzahl ist nicht wichtig, wenn Entwickler in der Lage sind, ihre Probleme mit meinen Antworten zu beheben, ist es genug, Prost.
Bahadir Tasdemir
Kann ich Zone mit XML Config Sheduler verwenden <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>?
Shareef
3
Daumen hoch für die Erwähnung der Zeitzone
Forhad
2
Danke, @Forhad. Wenn Sie Entwickler sind und sich mit Problemen befassen, die sich auf Datum und Uhrzeit beziehen, müssen Sie die Details der Zeitstempel, Zeitzonen und Konvertierungen kennen. Andernfalls sind Ihre Daten Unsinn
Bahadir Tasdemir
22

Sie können Ihre Methode mit annotieren @Scheduled(cron ="0 1 1 * * ?").

0 - ist für Sekunden

1- 1 Minute

1 Stunde des Tages.

user3298173
quelle
12

In Gipinanis Antwort fehlt etwas

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

Dies wird um 1.01 und 13.01 ausgeführt. Es kann verwendet werden, wenn Sie den Job mehrmals täglich ohne Muster ausführen müssen.

Das Zonenattribut ist sehr nützlich, wenn Sie Bereitstellungen auf Remoteservern durchführen. Dies wurde mit Feder 4 eingeführt.

Maleen Abewardana
quelle
2
Beachten Sie, dass die Unterstützung von Abkürzungen (für die Zeitzone) nur für die JDK 1.1.x-Kompatibilität gilt und vollständige Namen verwendet werden sollten - gemäß Javadoc
Slashron
6

Eine Sache, die mir aufgefallen ist, ist: Frühling CronTrigger ist nicht cron. Möglicherweise erhalten Sie 7 Parameter in einem gültigen Cron-Ausdruck (den Sie auf cronmaker.com validieren können), und Spring akzeptiert ihn dann nicht. In den meisten Fällen löschen Sie nur den letzten Parameter und alles funktioniert einwandfrei.

Irlan Cidade
quelle
1
"CronTrigger ist kein Quarz"
Sandy Simonton