SpringBoot用註解快速搭建定時任務,測試各種cron表達

頭條的文章和視頻支持定時發佈,那麼它的原理是什麼樣的呢,怎麼做到到了指定時間立即發佈,這其中用到了cron知識,它內部每秒都在掃描定時發佈的文章,直到你的文章的時間觸發條件,那麼就即可發佈。

SpringBoot定時任務

利用Spring自帶的定時任務,幾行代碼即可搞定這樣的需求

在方法中加入註解@Scheduled(cron = "0/1 * * * * ?")即可在指定的定時任務中執行對應的方法

SpringBoot用註解快速搭建定時任務,測試各種cron表達

cron是計劃執行任務的一種策略

Linux中的cron

Linux中自帶cron服務,但是這個服務默認沒有啟動,可以設置為自啟動。

Linux中的cron格式為M H D m d cmd,簡言之就是“分鐘 小時 自然月中的天 月 星期中的天 執行的命令”

它的最小單位是分鐘,所以正常來說是沒辦法執行秒級的任務,因此比如頭條的這種任務是無法執行的。

java中的cron

當然這種任務一般也不會用到Linux自帶的cron服務,一般我們都是用程序中的定時任務,cron表達式。

比如java中spring調用的jdk自帶的ScheduledExecutorService

cron表達式的格式是“秒 分 時 自然月的天 月 星期中的天 年”,可以根據這種策略執行秒級單位內的任何定時任務。

它的規則也是已經約束好的,比如

  • 秒:0到59的數字,*,逗號,-,/
  • 分:0到59的數字,*,逗號,-,/
  • 時:0到23的數字,*,逗號,-,/
  • 自然月的天:1到31的數字,*,逗號,-,/
  • 月:1到12的數字,*,逗號,-,/
  • 星期中的天:0到7的數字,*,逗號,-,/

其中

  • *代表任何數字
  • ,逗號代表多個數字的間隔符
  • -代表從幾到幾
  • /代表每隔多長時間觸發一次
  • ?代表只在日期和星期字段中使用,它通常指定為“無意義的值”,相當於佔位符;
  • L:代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最後一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同於7
  • W:代表表示離該日期最近的工作日。比如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。

常見的任務類型:

  • 每秒鐘執行一次:0/1 * * * * ?

這種常見於需要實時觸發的異步任務,這裡面的/就代表從0秒開始,每一秒執行一次。

  • 有個需要注意的0/50 * * * * ?

從0秒開始每50秒執行一次,那麼它的執行時間就是0秒一次,50秒一次,緊接著下一秒的0秒一次,50秒一次,這樣他們之間的間隔並不完全是50秒,這裡指的是秒0到59的週期內,從0開始每50秒一次

SpringBoot用註解快速搭建定時任務,測試各種cron表達

  • 每5分鐘執行一次:0 0/5 * * * ?

這裡呢秒是0,然後分鐘是從0開始每5分一次,也就是0分0秒一次,5分0秒1次依次類推

  • 5 0/5 * * * ? 0分5秒一次,5分5秒1次依次類推
  • * 0/2 * * * ? 0分內每秒一次執行60次,2分的時候每秒一次執行60次,依次類推
SpringBoot用註解快速搭建定時任務,測試各種cron表達

系統如果不需要集群的話,這種方式是最簡單快速的,但是當前大部分系統都需要集群,所以一般我們不會採用這種方案,而是用單獨定時任務分佈式集群系統,否則會造成任務重複執行。



分享到:


相關文章: