Ekspresi spring cron untuk setiap hari 1: 01: pagi

203

Saya mencoba menjalankan kode pada jadwal tetap, berdasarkan ekspresi Spring cron. Saya ingin kode dieksekusi setiap hari pada 1: 01: am. Saya mencoba ungkapan berikut, tetapi ini tidak cocok untuk saya. Apa yang salah dengan sintaks di sini?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
b-man
sumber
my cron expression 0 0 0 1 JAN MON bekerja hingga tahun lalu. 1 Jan dan seterusnya berhenti bekerja dengan mengatakan ekspresi cron yang tidak valid. Meskipun ini dimaksudkan untuk frekuensi yang sangat sedikit tetapi kami dapat menjalankan server tc. setelah 1 Januari tidak. Kapan saya berubah menjadi 0 0 7? * SUN itu mulai bekerja. Saya ingin tahu mengapa 0 0 0 1 JAN MON berhenti bekerja di mana seperti pada bulan Januari tahun lalu.
Spandey
0 0 0 1 JAN MON mungkin ekspresi yang salah, nah ini juga berfungsi dan server tc tidak pernah mengeluh
spandey

Jawaban:

574

Coba dengan:

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

Di bawah ini Anda dapat menemukan contoh pola dari forum musim semi:

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

Ekspresi Cron diwakili oleh enam bidang:

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

(*) berarti cocok dengan apa saja

*/X berarti "setiap X"

?("tidak ada nilai spesifik") - berguna ketika Anda perlu menentukan sesuatu di salah satu dari dua bidang di mana karakter diperbolehkan, tetapi tidak yang lain. Misalnya, jika saya ingin pelatuk saya menyala pada hari tertentu dalam sebulan (katakanlah, tanggal 10), tetapi saya tidak peduli pada hari apa dalam minggu itu, saya akan menempatkan "10" di hari- bidang bulan dan "?" di bidang hari-minggu.

PS: Untuk membuatnya berfungsi, ingatlah untuk mengaktifkannya dalam konteks aplikasi Anda: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- dukungan anotasi

gipinani
sumber
15
Format ini juga didokumentasikan di musim semi itu sendiri di sini - docs.spring.io/spring/docs/3.0.x/api/org/springframework/...
chrismarx
1
Saya kira spring cron dapat memberikan ketentuan detik juga tetapi cron unix yang normal berbasis menit ... seperti dalam unix man pages menit adalah satuan waktu terkecil yang dapat dikonfigurasi.
nanosoft
8
apa arti penting dari "?" karakter? Apakah itu hanya berlaku untuk bidang "hari dalam seminggu"? Apakah akan bekerja / melakukan sesuatu yang berbeda jika kita mengganti '?' dengan '*' dalam contoh Hari Natal?
mengepung
1
@encrest lihat di sini: stackoverflow.com/questions/11499740/...
gipinani
1
Tutorial yang bagus di < quartz-scheduler.org/documentation/quartz-2.x/tutorials/… >
Trey Jonn
90

Untuk penjadwal saya, saya menggunakannya untuk mengaktifkan jam 6 pagi setiap hari dan notasi cron saya adalah:

0 0 6 * * *

Jika Anda ingin 1: 01: pagi maka set ke

0 1 1 * * *

Kode lengkap untuk penjadwal

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

** SANGAT PENTING

Untuk memastikan ketepatan waktu pembakaran penjadwal Anda, Anda harus menetapkan nilai zona seperti ini (saya di Istanbul):

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

Anda dapat menemukan nilai zona waktu lengkap dari sini .

Catatan: Versi kerangka kerja Spring saya adalah: 4.0.7.RELEASE

Bahadir Tasdemir
sumber
1
Saya tidak tahu mengapa jawaban Anda hanya memiliki 12 walaupun itu satu-satunya jawaban yang benar di sini!
2
Terima kasih banyak @MoayadAbuJaber. Skornya tidak penting, jika pengembang dapat memperbaiki masalah mereka dengan jawaban saya itu sudah cukup, tepuk tangan.
Bahadir Tasdemir
bisakah saya menggunakan zona dengan xml config sheduler <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>??
shareef
3
acungan jempol untuk menyebutkan zona waktu
Forhad
2
Terima kasih, @Forhad. Jika Anda seorang pengembang dan menangani salah satu masalah yang terkait dengan tanggal dan waktu, Anda harus mengetahui detail cap waktu, zona waktu, dan konversi. Jika tidak, data Anda akan menjadi omong kosong
Bahadir Tasdemir
22

Anda dapat menggunakan anotasi metode Anda dengan @Scheduled(cron ="0 1 1 * * ?") .

0 - untuk detik

1- 1 menit

1 - jam dalam sehari.

pengguna3298173
sumber
12

Sesuatu yang hilang dari jawaban gipinani

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

Ini akan dieksekusi pada 1.01 dan 13.01. Ini dapat digunakan ketika Anda perlu menjalankan pekerjaan tanpa pola beberapa kali sehari.

Dan atribut zona sangat berguna, ketika Anda melakukan penyebaran di server jauh. Ini diperkenalkan dengan pegas 4.

Maleen Abewardana
sumber
2
Perhatikan bahwa dukungan singkatan (untuk zona waktu) hanya untuk kompatibilitas JDK 1.1.x dan nama lengkap harus digunakan - sesuai javadoc
slashron
6

Satu hal yang saya perhatikan adalah: spring CronTrigger bukan cron. Anda mungkin berakhir dengan 7 parameter dalam ekspresi cron yang valid (yang dapat divalidasi di cronmaker.com) dan kemudian pegas tidak menerimanya. Sebagian besar kasus Anda hanya menghapus parameter terakhir dan semuanya berfungsi dengan baik.

Irlan Cidade
sumber
1
"CronTrigger bukan Kuarsa"
Sandy Simonton