Note | cron表達式

2022 FEB 26

課題中需要實現定期操作的功能,基本步驟如下:

  1. 在有@SpringBootApplication(就是Application類)的地方添加@EnableScheduling
  2. 在需要定期執行的方法上面添加@Scheduled(...)

在註解中有很多種寫法來實現定期執行,但是固定時間(例如每一天的固定時間點)執行似乎(?)只能用cron表達式來實現。

cron表達式格式

javaCopied!
@Scheduled(cron = "* * * * * *") public void method() {}

星號分別對應秒數、分鐘、小時、日、月、星期、年(可為空)。

佔位符

日和星期可以用?來實現互斥,其他佔位符都要有具體意義,依賴關係從年遞減。

秒/分

值範圍:0-59,不允許為空,不合法的值將導致SchedulerException異常。

  • *代表每秒觸發,例如"* * * * * *"表示每秒觸發;
  • ,代表指定秒數觸發,例如"0,15,30,45 * * * * *"表示每分鐘的第0/15/30/45秒觸發;
  • -代表指定期間內觸發,例如0-30 * * * * *表示每分鐘的第0到第20秒每秒觸發一次;
  • /代表間隔,後面的值代表步長,例如0/30 * * * * *表示每分鐘的第0秒觸發,30秒觸發一次,0-30/20 * * * * *則表示第0秒到第30秒之間,每20秒觸發一次,也就是說第0秒和第20秒分別觸發。

小時

值範圍:0-23,不允許為空,不合法的值將導致SchedulerException異常,且佔位符和秒/分相同。

值範圍:1-31,不允許為空,不合法的值將導致SchedulerException異常。

值範圍:1-12,不允許為空,不合法的值將導致SchedulerException異常。

星期

值範圍:1-7/MON-SUN,不允許為空,不合法的值將導致SchedulerException異常。

值範圍:1970-2099,不合法的值將導致SchedulerException異常。

例子

javaCopied!
30 * * * * ?” //每30秒觸發任務30 10 * * * ?” //每小時的10分30秒觸發任務30 10 1 * * ?” //每天1點10分30秒觸發任務30 10 1 20 * ?” //每月20號1點10分30秒觸發任務30 10 1 20 10 ? *” //每年10月20號1點10分30秒觸發任務30 10 1 20 10 ? 2011//2011年10月20號1點10分30秒觸發任務30 10 1 ? 10 * 2011//2011年10月每天1點10分30秒觸發任務30 10 1 ? 10 SUN 2011//2011年10月每周日1點10分30秒觸發任務15,30,45 * * * * ?” //每15秒,30秒,45秒時觸發任務15-45 * * * * ?” //15到45秒內,每秒都觸發任務15/5 * * * * ?” //每分鐘的每15秒開始觸發,每隔5秒觸發一次15-30/5 * * * * ?” //每分鐘的15秒到30秒之間開始觸發,每隔5秒觸發一次0 0/3 * * * ?” //每小時的第0分0秒開始,每3分鐘觸發一次0 15 10 ? * MON-FRI” //星期一到星期五的10點15分0秒觸發任務0 15 10 L * ?” //每個月最後一天的10點15分0秒觸發任務0 15 10 LW * ?” //每個月最後一個工作日的10點15分0秒觸發任務0 15 10 ? * 5L//每個月最後一個星期四的10點15分0秒觸發任務0 15 10 ? * 5#3//每個月第三周的星期四的10點15分0秒觸發任務

參考: