SpringBoot定時任務(wù)的實(shí)現(xiàn)詳解
前言
定時任務(wù)是企業(yè)級開發(fā)中最常見的功能之一,如定時統(tǒng)計訂單數(shù)、數(shù)據(jù)庫備份、定時發(fā)送短信和郵件、定時統(tǒng)計博客訪客等。
簡單的定時任務(wù)可以直接通過Spring中的@Scheduled注解來實(shí)現(xiàn),復(fù)雜的定時任務(wù)則可以通過集成Quartz來實(shí)現(xiàn),下面分別予以介紹。
1. @Scheduled
@Scheduled是由Spring提供的定時任務(wù)注解,使用方便,配置簡單,可以解決工作中大部分的定時任務(wù)需求,使用方式如下:
1.1 創(chuàng)建工程
首先創(chuàng)建一個普通的Spring Boot Web工程,添加Web依賴即可,代碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
1.2 開啟定時任務(wù)
在項(xiàng)目啟動類上添加@EnableScheduling注解開啟定時任務(wù),代碼如下:
@SpringBootApplication
@EnableScheduling
public class TestforeverApplication {
public static void main(String[] args) {
SpringApplication.run(TestforeverApplication.class, args);
}
}1.3 配置定時任務(wù)
定時任務(wù)主要通過@Scheduled注解進(jìn)行配置,代碼如下:
@Component
public class MySchedule {
// 當(dāng)前任務(wù)執(zhí)行結(jié)束1秒后開啟另一個任務(wù)
@Scheduled(fixedDelay = 1000)
public void fixedDelay() {
System.out.println("fixedDelay:"+new Date());
}
// 當(dāng)前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù)
@Scheduled(fixedRate = 2000)
public void fixedRate() {
System.out.println("fixedRate:"+new Date());
}
// 當(dāng)前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù),并且首次延遲1秒執(zhí)行
@Scheduled(initialDelay = 1000, fixedRate = 2000)
public void initialDelay() {
System.out.println("initialDelay:"+new Date());
}
// 使用crom 表達(dá)式,下面表示定時任務(wù)每分鐘執(zhí)行一次
@Scheduled(cron = "0 * * * * ?")
public void cron() {
System.out.println("cron:"+new Date());
}
}代碼解釋:
- 通過@Scheduled注解來標(biāo)注一個定時任務(wù),其中fixedDelay= 1000表示在當(dāng)前任務(wù)執(zhí)行結(jié)束1秒后開啟另一個任務(wù),fixedRate= 2000表示在當(dāng)前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù),initialDelay= 1000則表示首次執(zhí)行的延遲時間。
- 在@Scheduled注解中也可以使用cron表達(dá)式,cron="0 * * * * ?"表示該定時任務(wù)每分鐘執(zhí)行一次
配置完成后,接下來啟動Spring Boot項(xiàng)目即可,定時任務(wù)部分打印日志如圖所示。

2. Quartz
2.1 Quartz簡介
Quartz是一個功能豐富的開源作業(yè)調(diào)度庫,它由Java寫成,可以集成在任何Java應(yīng)用程序中,包括Java SE和Java EE等。使用Quartz可以創(chuàng)建簡單或者復(fù)雜的執(zhí)行計劃,它支持?jǐn)?shù)據(jù)庫、集群、插件以及郵件,并且支持cron表達(dá)式,具有極高的靈活性。Spring Boot中集成Quartz和Spring 中集成Quartz比較類似,主要提供三個Bean: JobDetail、 Trigger 以及SchedulerFactory。
2.2 整合Spring Boot
首先創(chuàng)建Spring Boot項(xiàng)目,添加Quartz依賴,代碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.3 創(chuàng)建Job
接著我們使用不同的方式創(chuàng)建兩個 Job。
2.3.1 Bean方式
Job 可以是一個普通的 JavaBean。如果是普通的 JavaBean,那么可以先添加 @Component 注解將之注冊到 Spring 容器中。
@Component
public class MyFirstJob {
public void sayHello() {
System.out.println("MyFirstJob:sayHello:" + new Date());
}
}
2.3.2 抽象類 QuartzJobBean
Job 也可以繼承抽象類 QuartzJobBean。若繼承自 QuartzJobBean,則要實(shí)現(xiàn)該類中的 executeInternal 方法,該方法在任務(wù)被調(diào)用時使用。
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context) {
System.out.println("hello:" + name + ":" + new Date());
}
}
2.4 提供 Quartz 相關(guān)配置 Bean
接下來創(chuàng)建 QuartzConfig 對 JobDetail 和 Trigger 進(jìn)行配置,并創(chuàng)建 SchedulerFactory。
JobDetail 的配置有兩種方式:
- 第一種方式通過 MethodInvokingJobDetailFactoryBean 類配置 JobDetail,只需要指定 Job 的實(shí)例名和要調(diào)用的方法即可,注冊這用方式無法在創(chuàng)建 JobDetail 時傳遞參數(shù)。
- 第二種方式通過 JobDetailFactoryBean 來實(shí)現(xiàn),這種方式只需要指定 JobClass 即可,然后可以通過 JobDataMap 傳遞參數(shù)到 Job 中,Job 中只需要提供屬性名,并且提供一個相應(yīng)的 set 方法即可接收到參數(shù)。
Trigger 有多種不同的實(shí)現(xiàn),這里展示兩種常用的 Trigger:SimpleTrigger 和 CronTrigger。
- SimpleTrigger 使用 SimpleTriggerFactoryBean 進(jìn)行創(chuàng)建。在 SimpleTriggerFactoryBean 對象中,首先設(shè)置 JobDetail,接著配置任務(wù)循環(huán)次數(shù)、任務(wù)啟動延遲時間、任務(wù)的時間間隔。
- CronTrigger 使用 CronTriggerFactoryBean 進(jìn)行創(chuàng)建。在 SimpleTriggerFactoryBean 對象中,則主要配置 JobDetail 和 Cron 表達(dá)式。
@Configuration
public class QuartzConfig {
/********** 配置兩個 JobDetail **********/
// 通過 MethodInvokingJobDetailFactoryBean 類配置 JobDetail
@Bean
MethodInvokingJobDetailFactoryBean jobDetail1() {
MethodInvokingJobDetailFactoryBean bean =
new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
// 通過 JobDetailFactoryBean 來實(shí)現(xiàn) JobDetail
@Bean
JobDetailFactoryBean jobDetail2() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(MySecondJob.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","sang");
bean.setJobDataMap(jobDataMap);
bean.setDurability(true);
return bean;
}
/********** 創(chuàng)建兩個 Trigger **********/
// 創(chuàng)建一個 SimpleTrigger
@Bean
SimpleTriggerFactoryBean simpleTrigger() {
SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
bean.setJobDetail(jobDetail1().getObject()); // 設(shè)置 jobDetail
bean.setRepeatCount(3); // 任務(wù)循環(huán)次數(shù)為3(總共會執(zhí)行4次)
bean.setStartDelay(2000); // 任務(wù)啟動延遲2秒執(zhí)行
bean.setRepeatInterval(2000); // 任務(wù)的時間間隔為2秒
return bean;
}
// 創(chuàng)建一個 CronTrigger
@Bean
CronTriggerFactoryBean cronTrigger() {
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setJobDetail(jobDetail2().getObject()); // 設(shè)置 jobDetail
bean.setCronExpression("* * * * * ?"); // 設(shè)置 Cron 表達(dá)式
return bean;
}
/********** 創(chuàng)建 SchedulerFactory **********/
@Bean
SchedulerFactoryBean schedulerFactory() {
// 通過 SchedulerFactoryBean 創(chuàng)建 SchedulerFactor
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 配置兩個 Trigger
SimpleTrigger simpleTrigger = simpleTrigger().getObject();
CronTrigger cronTrigger = cronTrigger().getObject();
bean.setTriggers(simpleTrigger,cronTrigger);
return bean;
}
}經(jīng)過這幾步的配置,定時任務(wù)就配置成功了。接下來啟動Spring Boot項(xiàng)目,控制臺打印日志如圖所示。

可以看到 MyFirstJob 在重復(fù) 3 次之后便不再執(zhí)行(一共執(zhí)行 4 次),而 MySecondJob 則每秒執(zhí)行 1 次,一直執(zhí)行下去。
到此這篇關(guān)于SpringBoot定時任務(wù)的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringBoot定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 利用SpringBoot解決多個定時任務(wù)阻塞的問題
- SpringBoot中定時任務(wù)的使用方法解析
- Springboot實(shí)現(xiàn)定時任務(wù)的4種方式舉例詳解
- Springboot項(xiàng)目中定時任務(wù)的四種實(shí)現(xiàn)方式詳解
- SpringBoot實(shí)現(xiàn)動態(tài)增刪啟停定時任務(wù)的方式
- 一文帶你掌握SpringBoot中常見定時任務(wù)的實(shí)現(xiàn)
- SpringBoot之解決多個定時任務(wù)阻塞的問題
- SpringBoot創(chuàng)建定時任務(wù)的示例詳解
- SpringBoot自定義定時任務(wù)的實(shí)現(xiàn)示例
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Java與Python兩種編程語言的比較與應(yīng)用舉例詳解
這篇文章主要介紹了Java與Python兩種編程語言比較與應(yīng)用的相關(guān)資料,Java和Python各有特點(diǎn),Java適用于企業(yè)級應(yīng)用開發(fā),Python則在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域占優(yōu)勢,兩者在語法、應(yīng)用領(lǐng)域、性能、開發(fā)效率等方面存在差異,需要的朋友可以參考下2025-02-02
java 關(guān)鍵字static詳細(xì)介紹及如何使用
這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下2017-03-03
java實(shí)現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實(shí)現(xiàn)的日期時間轉(zhuǎn)換工具類,結(jié)合完整實(shí)例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下2019-10-10
新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法
這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-10-10
在SSM框架中將圖片上傳到數(shù)據(jù)庫中的實(shí)現(xiàn)代碼
這篇文章主要介紹了在SSM框架中將圖片上傳到數(shù)據(jù)庫中的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

