สปริง cron แสดงออกทุกวัน 1: 01: am


202

ฉันกำลังพยายามให้รหัสของฉันทำงานตามกำหนดเวลาที่แน่นอนโดยยึดตามนิพจน์ของ Spring cron ฉันต้องการให้โค้ดทำงานทุกวันเวลา 1: 01: 00 น. ฉันลองใช้นิพจน์ต่อไปนี้ แต่สิ่งนี้ไม่ได้เกิดขึ้นกับฉัน เกิดอะไรขึ้นกับไวยากรณ์ที่นี่

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



cron ของฉันแสดงออก 0 0 0 1 ม.ค. จันทร์ทำงานได้จนถึงปีที่แล้ว 1 มกราคมเป็นต้นไปหยุดทำงานพูด cron แสดงออกไม่ถูกต้อง แม้ว่านี่จะมีไว้สำหรับความถี่ที่น้อยมาก แต่เราสามารถเรียกใช้เซิร์ฟเวอร์ tc ได้ หลังจาก ม.ค. 1 มันไม่ได้ เมื่อฉันเปลี่ยนเป็น 0 0 7 * ซันมันเริ่มทำงาน ฉันอยากรู้ว่าทำไม 0 0 0 1 จันทร์มนหยุดทำงานที่ไหนเหมือนกันในปีที่แล้วแจน
spandey

0 0 0 1 JAN MON อาจมีการแสดงออกที่ไม่ถูกต้อง
ทีนี้

คำตอบ:


573

ลองด้วย:

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

ด้านล่างคุณสามารถค้นหารูปแบบตัวอย่างจากฟอรัมสปริง:

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

นิพจน์ Cron ถูกแสดงด้วยหกฟิลด์:

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

(*) หมายถึงการจับคู่ใด ๆ

*/X หมายถึง "every X"

?("ไม่มีค่าเฉพาะ") - มีประโยชน์เมื่อคุณต้องการระบุบางอย่างในหนึ่งในสองฟิลด์ที่อนุญาตให้ใช้อักขระได้ แต่ไม่ใช่ฟิลด์อื่น ตัวอย่างเช่นหากฉันต้องการให้ตัวเหนี่ยวไกยิงในวันใดวันหนึ่งของเดือน (พูดวันที่ 10) แต่ฉันไม่สนว่าวันไหนของสัปดาห์ที่เป็นเช่นนั้นฉันจะใส่ "10" ในวันนั้น - ฟิลด์ของเดือนและ "?" ในฟิลด์วันของสัปดาห์

PS: เพื่อให้ทำงานได้โปรดอย่าลืมเปิดใช้งานในบริบทแอปพลิเคชันของคุณ: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- คำอธิบายประกอบการสนับสนุน


15
รูปแบบมีการบันทึกไว้ในฤดูใบไม้ผลิด้วยตัวเองที่นี่ - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx

1
ฉันเดาว่า cron ฤดูใบไม้ผลิสามารถให้เสบียงวินาทีได้ แต่ยูนิกซ์ cron ตามปกติเป็นนาที ... เนื่องจากใน man page ของยูนิกซ์นาทีเป็นหน่วยที่เล็กที่สุดของเวลาที่สามารถกำหนดค่าได้
nanosoft

8
ความหมายของ "?" คืออะไร ตัวละคร? ใช้กับฟิลด์ "วัน (s) ของสัปดาห์" เท่านั้นหรือไม่ มันจะทำงาน / ทำสิ่งที่แตกต่างถ้าเราแทนที่ '?' ด้วย '*' ในตัวอย่างวันคริสต์มาส
encrest

1
@encrest ดูที่นี่: stackoverflow.com/questions/11499740/…
gipinani

1
การสอนที่ดีที่ < quartz-scheduler.org/documentation/quartz-2.x/tutorials/… >
Trey Jonn

90

สำหรับตัวจัดตารางเวลาของฉันฉันใช้มันเพื่อยิงตอน 6 โมงเช้าทุกวันและเครื่องหมาย cron ของฉันคือ:

0 0 6 * * *

หากคุณต้องการ 1: 01: am ให้ตั้งเป็น

0 1 1 * * *

รหัสที่สมบูรณ์สำหรับกำหนดการ

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

** สำคัญมาก

เพื่อให้แน่ใจเกี่ยวกับความถูกต้องของเวลาในการยิงของตัวกำหนดตารางเวลาคุณต้องตั้งค่าโซนเช่นนี้ (ฉันอยู่ในอิสตันบูล):

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

คุณสามารถค้นหาค่าโซนเวลาที่สมบูรณ์จากที่นี่

หมายเหตุ: เวอร์ชันเฟรมเวิร์กสปริงของฉันคือ: 4.0.7.RELEASE


1
ฉันไม่รู้ว่าทำไมคำตอบของคุณมี 12 ข้อเท่านั้นนี่เป็นคำตอบที่ถูกต้องเท่านั้น!

2
ขอบคุณมาก @MoayadAbuJaber คะแนนไม่สำคัญหากนักพัฒนาซอฟต์แวร์สามารถแก้ไขปัญหาด้วยคำตอบของฉันมันก็เพียงพอแล้ว
Bahadir Tasdemir

ฉันสามารถใช้โซนกับ xed config sheduler ได้หรือ<task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>ไม่?
shareef

3
ยกนิ้วให้สำหรับการกล่าวถึงเขตเวลา
Forhad

2
ขอบคุณ @Forhad หากคุณเป็นนักพัฒนาซอฟต์แวร์และจัดการกับปัญหาใด ๆ ที่เกี่ยวข้องกับวันที่และเวลาคุณต้องทราบรายละเอียดของการประทับเวลาเขตเวลาและการแปลง มิฉะนั้นข้อมูลของคุณจะไร้สาระ
Bahadir Tasdemir

22

@Scheduled(cron ="0 1 1 * * ?")คุณสามารถใช้คำอธิบายประกอบกับวิธีการของคุณ

0 - เป็นวินาที

1- 1 นาที

1 - ชั่วโมงของวัน


12

มีบางอย่างขาดหายไปจากคำตอบของ gipinani

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

สิ่งนี้จะดำเนินการที่ 1.01 และ 13.01 สามารถใช้เมื่อคุณต้องการเรียกใช้งานโดยไม่มีรูปแบบหลายครั้งต่อวัน

และคุณสมบัติโซนมีประโยชน์มากเมื่อคุณทำการปรับใช้ในเซิร์ฟเวอร์ระยะไกล สิ่งนี้ถูกนำมาใช้กับฤดูใบไม้ผลิ 4


2
โปรดทราบว่าการสนับสนุนตัวย่อ (สำหรับเขตเวลา) ใช้สำหรับความเข้ากันได้ของ JDK 1.1.x เท่านั้นและควรใช้ชื่อเต็ม - ตาม javadoc
slashron

6

สิ่งหนึ่งที่ฉันสังเกตเห็นคือสปริง CronTrigger ไม่ใช่ cron คุณอาจสิ้นสุดด้วย 7 พารามิเตอร์ในการแสดงออก cron ที่ถูกต้อง (ซึ่งคุณสามารถตรวจสอบใน cronmaker.com) แล้วสปริงไม่ยอมรับ กรณีส่วนใหญ่คุณเพียงแค่ลบพารามิเตอร์สุดท้ายและทุกอย่างทำงานได้ดี


1
"CronTrigger ไม่ใช่ Quartz"
Sandy Simonton

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.