Cron表達式是用來指定在何時執行一些任務的時間規則,是Linux和類Unix系統的標準任務調度程序。Cron表達式的語法包括分鐘、小時、日、月、周幾。本文以每年執行一次為中心,從多個方面進行詳細解析。
一、Cron表達式每天9點執行
在Cron表達式中,每個欄位都可以使用一個星號代替。星號代表所有合法的值。比如,分鐘欄位為*,代表每分鐘都執行任務。
在這個例子中,我們需要每天9點進行任務調度。因此,在小時欄位中填寫9,其餘欄位使用星號。Cron表達式為:
0 0 9 * * ?
上面的表達式中,第一和第二個欄位表示零秒和零分。第三個欄位代表小時,使用9。星號代表不限制日期和月份。最後一個問號是用於修飾日子和周幾欄位之間的衝突關係。
二、Cron表達式每3秒執行一次
要在Cron表達式中指定某個欄位的固定間隔,我們可以使用斜杠(/)操作符。該操作符可以用於一些範圍的值,代表這個範圍內每隔n步執行一次任務。
在這個例子中,我們需要每3秒執行一次任務。因此,我們在秒欄位中使用/3。其他欄位使用星號。Cron表達式為:
*/3 * * * * ?
三、Cron表達式每天執行兩次
如果需要在一天內指定執行兩次任務,我們可以使用逗號(,)操作符分隔多個時間點。每個時間點使用Cron表達式描述法規範。在這個例子中,我們需要在早上9點和下午5點分別執行任務。Cron表達式為:
0 0 9,17 * * ?
上面的表達式中,逗號操作符分隔了兩個時間點,分別是早上9點和下午5點。其他欄位使用星號代替,表示不限制日期和月份。
四、Cron表達式每天凌晨0點執行一次
對於每天凌晨0點執行的任務,我們可以在小時欄位中使用0。其他欄位使用星號,表示不限制日期和月份。Cron表達式為:
0 0 0 * * ?
五、Cron表達式每1小時執行一次
如果需要每隔1小時執行一次任務,我們可以在小時欄位中使用*/1,或者直接使用0。其他欄位使用星號代替。Cron表達式為:
0 0 */1 * * ? 或者 0 0 0/1 * * ?
六、Cron表達式每周一次
如果需要每周某個時間點執行一次任務,我們可以把周幾欄位(第六個欄位)設置為固定的值。在這個例子中,我們需要每周日的上午10點執行任務。Cron表達式為:
0 0 10 ? * SUN
上面的表達式中,問號(?)可以用於修飾日子和周幾欄位之間的衝突關係。SUN代表周日。
七、Cron表達式每周四執行一次
同樣地,如果需要在每周四的上午9點執行任務,我們可以使用以下Cron表達式:
0 0 9 ? * THU
上面的表達式中,THU代表周四。
八、Cron表達式每季度執行一次
如果需要每個季度執行一次任務,我們可以使用以下Cron表達式:
0 0 0 1 */3 ?
上面的表達式中,斜杠操作符代表每隔3個月執行一次。其他欄位使用星號代替。
九、Cron語法每周運行一次
最後一個例子是每周執行一次任務的Cron表達式。這個例子是一個熱門的問題,因為它看起來似乎應該使用0 0 0 * * 0或者0 0 0 * * 7這樣的表達式來指定,但是這是不正確的。正解是:
0 0 * * 0 ?
上面的表達式中,第五個欄位表示周幾,0或者7都代表周日。
代碼示例
下面是Java語言中使用Quartz框架使用Cron表達式每年執行一次的示例代碼:
import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Date; public class AnnualJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("This job runs annually at " + new Date()); } public static void main(String[] args) throws SchedulerException { JobDetail job = JobBuilder.newJob(AnnualJob.class) .withIdentity("job1", "group1") .build(); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1 1 ?")) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
上面的代碼創建了一個每年執行一次的任務,並指定了對應的Cron表達式。首先,我們定義一個AnnualJob類,實現了Quartz框架的Job介面。在execute方法中,我們輸出一句話,表示任務每年執行一次。
在main方法中,我們首先創建一個JobDetail類,代表一個可執行的工作,然後創建一個CronTrigger類,代表一種可重複執行的工作。在CronScheduleBuilder類的幫助下,我們將之前的Cron表達式傳遞給trigger,以便對可重複執行的工作進行計劃安排。
最後,我們使用StdSchedulerFactory類獲取調度程序的參考,啟動它並通過scheduleJob方法告訴它何時啟動我們的工作。執行結果如下:
This job runs annually at Wed Jan 01 00:00:00 CST 2025 Build successful.
總結
本文總結了Cron表達式每年執行一次的幾種使用方法,包括每天執行、每少秒執行、每周執行、每個季度執行等等。此外,本文還介紹了如何在Java中使用Quartz框架來執行這些Cron表達式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/247903.html