Wiosenne wyrażenie cron dla każdego dnia 1: 01: am

202

Staram się, aby mój kod był wykonywany zgodnie z ustalonym harmonogramem, w oparciu o wyrażenie Spring cron. Chciałbym, aby kod był wykonywany codziennie o 1: 01: am. Próbowałem następującego wyrażenia, ale to nie zadziałało. Co jest nie tak ze składnią tutaj?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
d-man
źródło
moje wyrażenie cron 0 0 0 1 JAN MON pracował do zeszłego roku. 1 stycznia przestaje działać, mówiąc nieprawidłowe wyrażenie cron. Chociaż było to przeznaczone na bardzo małą częstotliwość, ale byliśmy w stanie uruchomić serwer tc. po 1 stycznia nie. Kiedy zmieniłem na 0 0 7? * NIE, zaczęło działać. Ciekawi mnie, dlaczego 0 0 0 1 JAN MON przestał działać tam, gdzie było dobrze w zeszłym roku Jan.
spandey
0 0 0 1 JAN MON może być niewłaściwym wyrażeniem, również w tym działało i serwer tc nigdy nie narzekał
spandey

Odpowiedzi:

573

Spróbuj z:

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

Poniżej znajdują się przykładowe wzory z wiosennego forum:

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

Wyrażenie Cron jest reprezentowane przez sześć pól:

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

(*) oznacza pasujący dowolny

*/X oznacza „co X”

?(„brak konkretnej wartości”) - przydatne, gdy musisz podać coś w jednym z dwóch pól, w których znak jest dozwolony, ale nie w drugim. Na przykład, jeśli chcę, aby mój spust zadziałał w określony dzień miesiąca (powiedzmy 10), ale nie obchodzi mnie, jaki to będzie dzień tygodnia, wstawiłbym „10” pola miesiąca i „?” w polu dnia tygodnia.

PS: Aby to działało, pamiętaj o włączeniu go w kontekście aplikacji: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- obsługa adnotacji

gipinani
źródło
15
Format jest również udokumentowany wiosną tutaj - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx
1
Wydaje mi się, że spring cron jest również w stanie zapewnić obsługę sekund, ale normalny cron unix jest oparty na minutach ... tak jak na stronach manuala unixa minuta to najmniejsza jednostka czasu, którą można skonfigurować.
nanosoft
8
jakie jest znaczenie „?” postać? Czy dotyczy to tylko pola „dni tygodnia”? Czy to zadziałałoby / zrobiłoby coś innego, gdybyśmy zastąpili „?” z „*” w przykładzie Bożego Narodzenia?
atakują
1
@encrest spójrz tutaj: stackoverflow.com/questions/11499740/…
gipinani
90

W moim harmonogramie używam go do strzelania codziennie o 6 rano, a moja notacja cron to:

0 0 6 * * *

Jeśli chcesz 1: 01: am, a następnie ustaw na

0 1 1 * * *

Pełny kod dla harmonogramu

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

** BARDZO WAŻNE

Aby upewnić się co do poprawności czasu uruchamiania harmonogramu, musisz ustawić wartość strefy w ten sposób (jestem w Stambule):

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

Pełne wartości stref czasowych można znaleźć tutaj .

Uwaga: Moja wersja ramowa Spring to: 4.0.7. ZWOLNIENIE

Bahadir Tasdemir
źródło
1
Nie wiem, dlaczego twoja odpowiedź ma tylko 12, nawet jeśli jest to jedyna poprawna odpowiedź tutaj!
2
Dziękuję bardzo @MoayadAbuJaber. Wynik nie jest ważny, jeśli programiści są w stanie rozwiązać swoje problemy z moimi odpowiedziami, wystarczy, na zdrowie.
Bahadir Tasdemir
czy mogę korzystać ze strefy za pomocą narzędzia konfiguracyjnego XML <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>?
shareef
3
kciuki za wzmiankę o strefie czasowej
Forhad
2
Dzięki, @Forhad. Jeśli jesteś programistą i zajmujesz się którymkolwiek z problemów związanych z datami i godzinami, musisz znać szczegółowe informacje o znacznikach czasu, strefach czasowych i konwersjach. W przeciwnym razie Twoje dane będą nonsensowne
Bahadir Tasdemir
22

Możesz użyć adnotacji do swojej metody @Scheduled(cron ="0 1 1 * * ?").

0 - jest na sekundę

1- 1 minuta

1 - godzina dnia.

użytkownik3298173
źródło
12

W odpowiedzi Gipinani brakuje czegoś

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

Zostanie to wykonane o godzinie 1.01 i 13.01. Można go użyć, gdy trzeba uruchomić zadanie bez wzoru wiele razy dziennie.

A atrybut strefy jest bardzo przydatny, gdy wykonujesz wdrożenia na zdalnych serwerach. Zostało to wprowadzone wiosną 4.

Maleen Abewardana
źródło
2
Zauważ, że obsługa skrótów (dla strefy czasowej) dotyczy tylko kompatybilności JDK 1.1.x i należy używać pełnych nazw - zgodnie z javadoc
slashron 13.09.17
6

Zauważyłem jedną rzecz: wiosna CronTrigger nie jest cronem. Możesz skończyć z 7 parametrami w prawidłowym wyrażeniu cron (które możesz sprawdzić na cronmaker.com), a następnie wiosną go nie zaakceptować. W większości przypadków po prostu usuwasz ostatni parametr i wszystko działa dobrze.

Irlan Cidade
źródło
1
„CronTrigger nie jest kwarcem”
Sandy Simonton,