spring boot 實現定時任務

2021-09-29 06:31:15 字數 4528 閱讀 5476

參考

第一步:編寫乙個 job 類,需要實現 org.quartz.job 介面

import org.quartz.job; 

import org.quartz.jobexecutioncontext;

import org.quartz.jobexecutionexception;

public class hellojob implements job

}

第二步:使用 job、trigger、schedule 呼叫定時任務

import static org.quartz.jobbuilder.newjob; 

import static org.quartz.******schedulebuilder.******schedule;

import static org.quartz.triggerbuilder.newtrigger;

import org.quartz.jobdetail;

import org.quartz.scheduler;

import org.quartz.schedulerexception;

import org.quartz.trigger;

import org.quartz.impl.stdschedule***ctory;

public class quartztest catch (schedulerexception e) catch (interruptedexception e)

} }

spring boot 實現定時任務的幾種方式

##簡單的定時任務

在springboot專案中,我們可以很優雅的使用註解來實現定時任務,首先建立專案,匯入依賴:

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

建立任務類:

@slf4j

@component

public class scheduledservice ",system.currenttimemillis());

}@scheduled(fixedrate = 5000)

public void scheduled1() ", system.currenttimemillis());

}@scheduled(fixeddelay = 5000)

public void scheduled2() ",system.currenttimemillis());

}}

在主類上使用@enablescheduling註解開啟對定時任務的支援,然後啟動專案建立任務類:

import org.springframework.scheduling.annotation.enablescheduling;

@enablescheduling

public static void main(string args) }

執行結果:

可以看到三個定時任務都已經執行,並且使同乙個執行緒中序列執行,如果只有乙個定時任務,這樣做肯定沒問題,當定時任務增多,如果乙個任務卡死,會導致其他任務也無法執行。

在傳統的spring專案中,我們可以在xml配置檔案新增task的配置,而在springboot專案中一般使用config配置類的方式新增配置,所以新建乙個asyncconfig類

@configuration

@enableasync

public class asyncconfig

}

@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天

注意:在使用「l」引數時,不要指定列表或範圍,因為這會導致問題

w 字元代表著平日(mon-fri),並且僅能用於日域中。它用來指定離指定日的最近的乙個平日。大部分的商業處理都是基於工作周的,所以 w 字元可能是非常重要的。

例如,日域中的 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依賴:

org.springframework.boot

spring-boot-starter-quartz

如果是1.5.9則要使用以下新增依賴:

org.quartz-scheduler

quartz

2.3.0

org.springframework

spring-context-support

這裡我使用springboot版本是2.0.0.build-snapshot,該版本開始整合了quartz,所以事實現起來很方便。其它好像比較麻煩,這裡就不介紹,以後有時間再詳細深入了解quartz。

建立任務類testquartz,該類主要是繼承了quartzjobbean

public class testquartz extends quartzjobbean 

}

建立配置類quartzconfig

@configuration

public class quartzconfig

@bean

public trigger testquartztrigger()

}

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

SpringBoot定時任務實現

靜態定時任務實現 基於註解來建立定時任務 configuration enablescheduling public class scheduletask 基於資料庫的動態定時任務實現 將定時任務配置在資料庫,啟動專案的時候,用mybatis讀取資料庫,例項化物件,並設定定時任務。如果需要新增,減少...