在 spring + springmvc 環境中,一般來說,要實現定時任務,我們有兩中方案,一種是使用 spring 自帶的定時任務處理器 @scheduled 註解,另一種就是使用第三方框架 quartz ,spring boot 源自 spring+springmvc ,因此天然具備這兩個 spring 中的定時任務實現策略,當然也支援 quartz,本文我們就來看下 spring boot 中兩種定時任務的實現方式。
@scheduled
使用 @scheduled 非常容易,直接建立乙個 spring boot 專案,並且新增 web 依賴 spring-boot-starter-web,專案建立成功後,新增 @enablescheduling 註解,開啟定時任務:
@enablescheduling
public static void main(string[
] args)
}接下來配置定時任務:
@scheduled(fixedrate = 2000)
public void fixedrate(
)@scheduled(fixeddelay = 2000)
public void fixeddelay(
)@scheduled(initialdelay = 2000,fixeddelay = 2000)
public void initialdelay(
)
首先使用 @scheduled 註解開啟乙個定時任務。
fixedrate 表示任務執行之間的時間間隔,具體是指兩次任務的開始時間間隔,即第二次任務開始時,第一次任務可能還沒結束。
fixeddelay 表示任務執行之間的時間間隔,具體是指本次任務結束到下次任務開始之間的時間間隔。
initialdelay 表示首次任務啟動的延遲時間。
所有時間的單位都是毫秒。
上面這是乙個基本用法,除了這幾個基本屬性之外,@scheduled 註解也支援 cron 表示式,使用 cron 表示式,可以非常豐富的描述定時任務的時間。cron 表示式格式如下:
[秒]
[分][小時]
[日][月]
[周][年]
具體取值如下:
序號 說明 是否必填 允許填寫的值 允許的萬用字元
1 秒 是 0-59 - * /
2 分 是 0-59 - * /
3 時 是 0-23 - * /
4 日 是 1-31 - * ? / l w
5 月 是 1-12 or jan-dec - * /
6 周 是 1-7 or sun-sat - * ? / l #
7 年 否 1970-2099 - * /
這一塊需要大家注意的是,月份中的日期和星期可能會起衝突,因此在配置時這兩個得有乙個是 ?
萬用字元含義:
? 表示不指定值,即不關心某個欄位的取值時使用。需要注意的是,月份中的日期和星期可能會起衝突,因此在配置時這兩個得有乙個是 ?
周字段的設定,若使用英文本母是不區分大小寫的 ,即 mon 與mon相同
l 表示最後的意思。在日字段設定上,表示當月的最後一天(依據當前月份,如果是二月還會自動判斷是否是潤年), 在周字段上表示星期六,相當於"7"或"sat"(注意週日算是第一天)。如果在"l"前加上數字,則表示該資料的最後乙個。例如在周字段上設定"6l"這樣的格式,則表示"本月最後乙個星期五"
w 表示離指定日期的最近工作日(周一至周五),例如在日字段上設定"15w",表示離每月15號最近的那個工作日觸發。如果15號正好是週六,則找最近的周五(14號)觸發, 如果15號是週未,則找最近的下周一(16號)觸發,如果15號正好在工作日(周一至周五),則就在該天觸發。如果指定格式為 「1w」,它則表示每月1號往後最近的工作日觸發。如果1號正是週六,則將在3號下周一觸發。(注,「w"前只能設定具體的數字,不允許區間」-")
l 和 w 可以一組合使用。如果在日字段上設定"lw",則表示在本月的最後乙個工作日觸發(一般指發工資 )
例如,在 @scheduled 註解中來乙個簡單的 cron 表示式,每隔5秒觸發一次,如下:
@scheduled(cron =
"0/5 * * * * *"
)public void cron(
)
上面介紹的是使用 @scheduled 註解的方式來實現定時任務,接下來我們再來看看如何使用 quartz 實現定時任務。
quartz
一般在專案中,除非定時任務涉及到的業務實在是太簡單,使用 @scheduled 註解來解決定時任務,否則大部分情況可能都是使用 quartz 來做定時任務。在 spring boot 中使用 quartz ,只需要在建立專案時,新增 quartz 依賴即可:
專案建立完成後,也需要新增開啟定時任務的註解:
@enablescheduling
public static void main(string[
] args)
}quartz 在使用過程中,有兩個關鍵概念,乙個是jobdetail(要做的事情),另乙個是觸發器(什麼時候做),要定義 jobdetail,需要先定義 job,job 的定義有兩種方式:
第一種方式,直接定義乙個bean:
@component
public class myjob1
}
關於這種定義方式說兩點:
首先將這個 job 註冊到 spring 容器中。
這種定義方式有乙個缺陷,就是無法傳參。
第二種定義方式,則是繼承 quartzjobbean 並實現預設的方法:
public class myjob2 extends quartzjobbean
public void sethelloservice(helloservice helloservice)
@override
protected void executeinternal(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception
}public class helloservice
}
和第1種方式相比,這種方式支援傳參,任務啟動時,executeinternal 方法將會被執行。
job 有了之後,接下來建立類,配置 jobdetail 和 trigger 觸發器,如下:
@configuration
public class quartzconfig
@bean
jobdetailfactorybean jobdetailfactorybean(
) @bean
******trigge***ctorybean ******trigge***ctorybean(
) @bean
crontrigge***ctorybean crontrigger(
) @bean
schedule***ctorybean schedule***ctorybean(
) @bean
helloservice helloservice(
)}
關於這個配置說如下幾點:
jobdetail 的配置有兩種方式:methodinvokingjobdetailfactorybean 和 jobdetailfactorybean 。
使用 methodinvokingjobdetailfactorybean 可以配置目標 bean 的名字和目標方法的名字,這種方式不支援傳參。
使用 jobdetailfactorybean 可以配置 jobdetail ,任務類繼承自 quartzjobbean ,這種方式支援傳參,將引數封裝在 jobdatamap 中進行傳遞。
trigger 是指觸發器,quartz 中定義了多個觸發器,這裡向大家展示其中兩種的用法,******trigger 和 crontrigger 。
******trigger 有點類似於前面說的 @scheduled 的基本用法。
crontrigger 則有點類似於 @scheduled 中 cron 表示式的用法。
全部定義完成後,啟動 spring boot 專案就可以看到定時任務的執行了。
spring boot 實現定時任務
參考 第一步 編寫乙個 job 類,需要實現 org.quartz.job 介面 import org.quartz.job import org.quartz.jobexecutioncontext import org.quartz.jobexecutionexception public cl...
springboot定時任務的實現
今天在專案中需要用到乙個定時任務的功能,專案使用的框架是springboot,在此記錄一下再springboot中使用定時任務的一種方式,也希望能幫到有需要的小夥伴。第一步 新增依賴 org.springframework.boot spring boot starter quartz org.my...
spring boot 定時任務實現
scheduled 使用 scheduled 非常容易,直接建立乙個 spring boot 專案,並且新增 web 依賴 spring boot starter web,專案建立成功後,新增 enablescheduling 註解,開啟定時任務 enablescheduling 開啟定時任務 pu...