1. 概述
Cron 表達式使我們能夠定期在特定日期和時間安排任務執行。自它在 Unix 系統中引入以來,其他基於 Unix 的操作系統和軟件庫(包括 Spring Framework)也採用了這種任務安排的方法。
在本快速教程中,我們將探討 Unix 操作系統和 Spring Framework 中 Cron 表達式之間的差異。
2. Unix Cron
在大多數基於 Unix 的系統中,crontab (任務調度表) 有五個字段:分鐘 (0-59), 小時 (0-23), 月份中的日期 (1-31), 月份 (1-12 或名稱), 以及星期幾 (0-7 或名稱)。
我們可以將一些特殊值放在每個字段中,例如星號 (*)。
5 0 * * *任務將在每天午夜後 5 分鐘執行。 還可以使用一系列值:
5 0-5 * * *調度器將在午夜後 5 分鐘執行任務,並且每天在 1 點、2 點、3 點、4 點和 5 點的 5 分鐘後也會執行。
或者,我們可以使用以下值列表:
5 0,3 * * *現在,調度器會在每月的午夜和下午三點後每五分鐘執行任務。原始的Cron表達式提供了比我們所討論的更多功能。
然而,它有一個主要限制:由於它沒有專門的秒級字段,因此無法按秒級安排任務。
讓我們看看Spring如何解決這個問題。
3. Spring 定時器
為了在 Spring 中安排週期性後台任務,我們通常會將 Cron 表達式傳遞給 <em >@Scheduled</em> 註解。
與基於 Unix 的系統中的 Cron 表達式不同,<em >@Scheduled</em> 註解中的 Cron 表達式包含六個以空格分隔的字段:秒、分、時、日、月和星期幾。
例如,要運行一個每十秒執行一次的任務,我們可以這樣做:
*/10 * * * * *此外,為了每天早上8點到10點之間每20秒執行一次任務,請執行以下操作:
*/20 * 8-10 * * *如上例所示,第一個字段代表表達式的第二部分。這是兩種實現之間的差異。 儘管第二字段存在差異,Spring 仍然支持 Cron 的許多功能,例如範圍數字或列表。
從實現角度來看,CronSequenceGenerator 類負責解析 Spring 中的 Cron 表達式。
4. 結論
在本教程中,我們對比了 Spring 和大多數基於 Unix 的系統中的 Cron 實現差異。在過程中,我們還看到了幾個示例。
為了查看更多 Cron 表達式示例,強烈建議您查看我們的《Cron 表達式指南》。此外,查看 CronSequenceGenerator 類源代碼,可以幫助我們更好地理解 Spring 如何實現此功能。