Springboot中實現定時任務的兩種方式

2021-10-03 13:58:37 字數 4124 閱讀 2730

在 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...