定時任務實現的幾種方式:
這個目前在專案中用的較少,直接貼demo**。具體的介紹可以檢視api
public class testtimer ",system.currenttimemillis());@scheduled(fixedrate = 5000)
public void scheduled1() ", system.currenttimemillis());
@scheduled(fixeddelay = 5000)
public void scheduled2() ",system.currenttimemillis());
在主類上使用@enablescheduling註解開啟對定時任務的支援,然後啟動專案
可以看到三個定時任務都已經執行,並且使同乙個執行緒中序列執行,如果只有乙個定時任務,這樣做肯定沒問題,當定時任務增多,如果乙個任務卡死,會導致其他任務也無法執行。
在傳統的spring專案中,我們可以在xml配置檔案新增task的配置,而在springboot專案中一般使用config配置類的方式新增配置,所以新建乙個asyncconfig類
@configuration@enableasync
public class asyncconfig {
此處成員變數應該使用@value從配置中讀取
private int corepoolsize = 10;
private int maxpoolsize = 200;
private int queuecapacity = 10;
@bean
public executor taskexecutor() {
threadpooltaskexecutor executor = new threadpooltaskexecutor();
executor.setcorepoolsize(corepoolsize);
executor.setmaxpoolsize(maxpoolsize);
executor.setqueuecapacity(queuecapacity);
executor.initialize();
return executor;
@configuration
:表明該類是乙個配置類
@enableasync
:開啟非同步事件的支援
然後在定時任務的類或者方法上新增@async
。最後重啟專案,每乙個任務都是在不同的執行緒中
在上面的定時任務中,我們在方法上使用@scheduled註解來設定任務的執行時間,並且使用三種屬性配置方式:
fixedrate:定義乙個按一定頻率執行的定時任務
fixeddelay:定義乙個按一定頻率執行的定時任務,與上面不同的是,改屬性可以配合initialdelay
, 定義該任務延遲執行時間。
cron:通過表示式來配置任務執行時間
乙個cron表示式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次為:
其中每個元素可以是乙個值(如6),乙個連續區間(9-12),乙個間隔時間(8-18/4)(/表示每隔4小時),乙個列表(1,3,5),萬用字元。由於」月份中的日期」和」星期中的日期」這兩個元素互斥的,必須要對其中乙個設定。配置例項:
有些子表示式能包含一些範圍或列表
例如:子表示式(天(星期))可以為 「mon-fri」,「mon,wed,fri」,「mon-wed,sat」「*」字元代表所有可能的值
「/」字元用來指定數值的增量
例如:在子表示式(分鐘)裡的「0/15」表示從第0分鐘開始,每15分鐘「?」字元僅被用於天(月)和天(星期)兩個子表示式,表示不指定值在子表示式(分鐘)裡的「3/20」表示從第3分鐘開始,每20分鐘(它和「3,23,43」)的含義一樣
當2個子表示式其中之一被指定了值以後,為了避免衝突,需要將另乙個子表示式的值設為「?」
「l」 字元僅被用於天(月)和天(星期)兩個子表示式,它是單詞「last」的縮寫
如果在「l」前有具體的內容,它就具有其他的含義了。
例如:「6l」表示這個月的倒數第6天w 字元代表著平日(mon-fri),並且僅能用於日域中。它用來指定離指定日的最近的乙個平日。大部分的商業處理都是基於工作周的,所以 w 字元可能是非常重要的。注意:在使用「l」引數時,不要指定列表或範圍,因為這會導致問題
例如,日域中的 15w 意味著 「離該月15號的最近乙個平日。」 假如15號是星期六,那麼 trigger 會在14號(星期五)觸發,因為星期四比星期一離15號更近。c:代表「calendar」的意思。它的意思是計畫所關聯的日期,如果日期沒有被關聯,則相當於日曆中所有日期。
例如5c在日期欄位中就相當於日曆5日以後的第一天。1c在星期欄位中相當於星期日後的第一天。字段
允許值允許的特殊字元
秒0~59
, - * /
分0~59
, - * /
小時0~23
, - * /
日期1-31
, - * ? / l w c
月份1~12或者jan~dec
, - * /
星期1~7或者sun~sat
, - * ? / l c #
年(可選)
留空,1970~2099
, - * /
如果springboot版本是2.0.0以後的,則在spring-boot-starter中已經包含了quart的依賴,則可以直接使用spring-boot-starter-quartz
依賴:
spring-boot-starter-quartz
如果是1.5.9則要使用以下新增依賴:
org.quartz-schedulerquartz
2.3.0
org.springframework
spring-context-support
這裡我使用springboot版本是2.0.0.build-snapshot
,該版本開始整合了quartz,所以事實現起來很方便。其它好像比較麻煩,這裡就不介紹,以後有時間再詳細深入了解quartz。
* 執行定時任務
* @param jobexecutioncontext
* @throws jobexecutionexception
@override
protected void executeinternal(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception {
system.out.println("quartz task "+new date());
@configurationpublic class quartzconfig {
@bean
public jobdetail teatquartzdetail(){
return jobbuilder.newjob(testquartz.class).withidentity("testquartz").storedurably().build();
@bean
public trigger testquartztrigger(){
******schedulebuilder schedulebuilder = ******schedulebuilder.******schedule()
.withintervalinseconds(10) //設定時間週期單位秒
.repeatforever();
return triggerbuilder.newtrigger().forjob(teatquartzdetail())
.withidentity("testquartz")
.withschedule(schedulebuilder)
.build();
上面都是簡單的介紹了關於springboot定時任務的處理,直接使用springtask註解的方式應該是最方便的,而使用quartz從2.0開始也變得很方便。對於這兩種方式,應該說各有長處吧,按需選擇。另外關於quartz的詳細內容可以檢視官方文件:傳送門
#參考
SpringBoot幾種定時任務的實現方式
springboot幾種定時任務的實現方式 wanqh的個人部落格 定時任務實現的幾種方式 這個目前在專案中用的較少,直接貼demo 具體的介紹可以檢視api public class testtimer system.currenttimemillis scheduled fixedrate 50...
SpringBoot 定時任務
第一步 在啟動類中加入如下註解 enablescheduling public class public static void main string args 注意 enablescheduling必須加,否則無法開啟定時任務 第二步 建立定時任務 component public class ...
Spring boot定時任務
最近做專案,需要使用定時任務,半個小時去更新redis資料,於是便學習了一下經驗。希望可以幫到你們。定時任務可使用三種 created by fx on 2017 9 4.component allargsconstructor public class featuredatatask 實現乙個任務...