超神理解:SpringBoot 處理定時任務
項目經常會用到定時任務,springboot 自然是可以通過整合相關組件來實現的。
目前常用的定時任務的實現有兩種:
-
通過 spring 自帶的定時器任務 @Schedule 來實現
-
通過 Quartz 來實現
本次借用上一篇《spring boot 整合 Mybatis》的既有項目結構進行案例調試。
一、cron 表達式
無論上面說的哪種實現方式,都需要用到 cron 表達式,因此不得不先介紹下它。
Cron 表達式是一個字符串,由 6 或 7 個域組成,每個域有不同的含義,每個域之間用空格隔開。有 2 中格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year (7 個域)
Seconds Minutes Hours DayofMonth Month DayofWeek (6 個域)
每個域可能出現的值:
除了以上內容外,還可能出現一些特殊字符:
舉例:
以上看上去有點複雜,不過不用擔心,記住常用的就行了。另外,現在網上還有 在線 Cron 表達式生成器可以幫助我們設定確定相關表達式內容。
二、@Schedule 實現
- 引入依賴
- 代碼實現
a、新建類 JdkSchedule
裏面的 userService 爲上一次添加的內容
b、啓動類添加註解,啓動定時任務
- 測試效果
每隔兩秒打印一次:
三、Quartz 實現
1.Quartz 介紹
Quartz 是一個完全由 Java 編寫的開源任務調度的框架,通過觸發器設置作業定時運行規則,控制作業的運行時間。它包括調度器、觸發器、作業。
- 基本使用
a、引入依賴
b、創建 job 類
publicclass MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("...quartz job 觸發執行...");
}
}
需要實現 Quartz 的 Job 接口
c、編寫測試類:
/**
* quartz 原生態用法
*/
public class JobTestMain {
public static void main(String[] args) throws SchedulerException {
//1. 創建 job
JobDetail job = JobBuilder.newJob(MyJob.class).build();
//2. 創建 trigger
CronTrigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?"))
.build();
//3. 創建 schedule
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
d、執行測試類 JobTestMain:
每三秒打印一次:
3.springboot 整合使用
a、引入依賴
<!-- 添加 schedule 依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 引入 quartz 依賴 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<!-- 引入 spring tx 依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
springboot 整合的時候,需要添加這三個依賴。
編寫配置類
/**
* springboot 整合 quartz 使用方法
*/
@Configuration
public class QuartzConfig {
/**
* 創建 job 對象
* @return
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
jobDetailFactoryBean.setJobClass(MyJob.class);
return jobDetailFactoryBean;
}
/**
* 創建 trigger 對象 - cron 表達式對象
* @param jobDetailFactoryBean
* @return
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?");
// 關聯 JobDetail 對象 cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
return cronTriggerFactoryBean;
}
/**
* 創建 trigger 對象 - 一般對象
* @param jobDetailFactoryBean
* @return
*/
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
// 關聯 JobDetail 對象
simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
// 設置重複次數, 這裏配置的是重複次數,而不是總次數;總次數 = 重複次數 + 1,也就是說這裏配置的次數是:執行完一次之後,再重複執行的次數
simpleTriggerFactoryBean.setRepeatCount(1);
// 設置間隔時間
simpleTriggerFactoryBean.setRepeatInterval(2000);
return simpleTriggerFactoryBean;
}
/**
* 創建 schedule 對象
* @param triggerFactoryBean
* @return
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(triggerFactoryBean.getObject());
return schedulerFactoryBean;
}
}
這裏需要注意下,schedulerFactoryBean() 方法中傳入的參數如果是 CronTriggerFactoryBean, 則執行的是 cronTriggerFactoryBean() 對應的設置;參數如果是 SimpleTriggerFactoryBean, 則執行的是 simpleTriggerFactoryBean() 對應的設置。
啓動類添加註解
測試效果
每 5 秒鐘執行一次:
如果前面的 @Schedule 和這裏的 Quartz 的定時任務放在一起了,則執行效果爲兩個 Job 一起執行:
...quartz job 觸發執行...
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
** 觸發 JDK 定時器 ***
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
** 觸發 JDK 定時器 ***
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
** 觸發 JDK 定時器 ***
...quartz job 觸發執行...
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
** 觸發 JDK 定時器 ***
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
** 觸發 JDK 定時器 ***
User{id=1, name='sam', age=32}
User{id=2, name='hah', age=10}
...quartz job 觸發執行...
以上即爲本文全部內容。
來源: https://www.toutiao.com/a7005166040321753614/?log_from=9c33004fc8254_1631498345246
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/RnMmq7h3UU9CfCHGD5Jpkw