作者:追夢1819
原文:https://www.cnblogs.com/yanfei1819/p/11076555.html
版權宣告:本文為博主原創文章,轉載請附上博文連結!
引言
相信大家對定時任務很熟悉,其重要性也不言而喻。定時發簡訊、定時批量操作、定時統計資料等,都離不開定時任務。本文將講解定時任務在 SpringBoot 專案中的應用。
版本資訊
- JDK:1.8
- SpringBoot :2.0.1.RELEASE
- maven:3.3.9
- IDEA:2019.1.1
- quartz:2.3.0
定時任務實現方式
JDK自帶的Timer
Timer 是Java 自帶的定時任務類。可以用作比較簡單的定時任務。通常用的不多。下面以一個小的示例展示其用法。
SpringBoot整合的schedule
這種方式是 SpringBoot 整合的,使用很簡單。
首先,引入 SpringBoot 的基礎 jar:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
然後再啟動類中新增註解 @EnableScheduling
即可開啟 SpringBoot 定時任務:
@SpringBootApplication
@EnableScheduling
public class TimedTaskDemoApplication {
public static void main(String[] args) {
SpringApplication.run(TimedTaskDemoApplication.class, args);
}
}
下面根據 @Scheduled
的不同屬性建立幾個任務:
任務一:
@Component
public class FirstTask {
/**
* cron 表示式
*/
// @Scheduled(cron = "0/2 * * * * *")
@Scheduled(cron="${cron.schedule}")
public void run(){
System.out.println("這是建立的第一個定時任務");
}
}
作幾點說明:
- cron 表示式是
@Scheduled
的屬性之一,其值可以直接設定為 cron 表示式; @Scheduled(cron="${cron.schedule}")
是動態讀取 application.properties 配置檔案中的 cron 表示式。例如專案中的一個需求是每天凌晨0點執行,但是對於測試人員來說,不可能等到凌晨測試。動態讀取可以幫助解決該問題。
任務二:
@Component
public class SecondTask {
/**
* 上一次執行完畢時間點之後多長時間再執行(ms)
*/
@Scheduled(fixedDelay = 2000)
public void run(){
System.out.println("這是建立的第二個定時任務");
}
}
任務三:
@Component
public class ThirdTask {
/**
* 與fixedDelay功能相同,上一次執行完畢時間點之後多長時間再執行(ms),區別是:1、時間是字串;2、支援佔位符
*/
// @Scheduled(fixedDelayString = "2000")
@Scheduled(fixedDelayString = "${time.fixedDelay}")
public void run(){
System.out.println("這是建立的第三個定時任務");
}
}
上面的三個任務列舉了 @Scheduled 註解的三個引數。其實除此之外,檢視 @Scheduled 的原始碼可知,還有其餘的幾個引數:
- fixedRate:上一次開始執行時間點之後多長時間再執行;
- fixedRateString:上一次開始執行時間點之後多長時間再執行;
- fixedRateString:與
fixedRate
意思相同,只是使用字串的形式。唯一不同的是支援佔位符; - initialDelay:第一次延遲多長時間後再執行;
- initialDelayString:與 initialDelay 意思相同,只是使用字串的形式。唯一不同的是支援佔位符;
整合Quartz
如果以上的方式都無法滿足專案的需求,則可以試試 Quartz 排程框架。它功能的強大以及使用無需多說了。此處我們看看 Quartz 在 SpringBoot 中的使用。
建立專案,引入 Quartz 排程框架啟動器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
需要注意版本資訊,如果 SpringBoot 版本是2.0以後的版本,直接引入 Quartz 啟動器即可。但是如果是2.0以前的版本,需要引入以下 jar 包:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
下面建立任務了:
public class QuartzTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(new Date());
}
}
任務需要繼承 QuartzJobBean 抽象類,並重寫 executeInternal 方法。
第三步,建立 quartz 配置類,新增 @Configuration
註解:
@Configuration
public class QuartzConfig {
@Bean
public JobDetail testQuartzTask() {
return JobBuilder.newJob(QuartzTask.class).withIdentity("quartztask").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger2() {
//cron方式,每隔5秒執行一次
return TriggerBuilder.newTrigger().forJob(testQuartzTask())
.withIdentity("quartztask")
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?"))
.build();
}
}
上面的示例是使用 cron 表示式,當然也可以是固定時間間隔。本節是闡述 SpringBoot 和 Quartz 的整合,不作 Quartz 的詳細使用。感興趣的讀者可以登入 Quartz 的官網 或者中文官網自行研究。
總結
定時任務的實現方式有很多種,除了上面說到的幾種方式,還有利用執行緒池實現定時任務,有的系統是通過 Liunx 實現定時任務。總之,定時任務的實現方式多種多樣,其方式要根據專案的實際情況而選。切不可為了實現而實現。