本文主旨在于能定時任務(wù)能運(yùn)行起來,對于背后原理尚未深入探討,所以若提及原理相關(guān),多是揣摩估計(jì),并未考究,僅供參考
一、單個定時任務(wù)時
1. pom.xml
在springboot基礎(chǔ)上加上以下依賴:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2. 添加任務(wù)類
/**
* 一個任務(wù)
*
* @author Sprite
* @date 2018/09/06
*/
@Component
public class SingleTask {
public void singleTask(){
System.out.println("執(zhí)行單個定時任務(wù)");
}
}
看到有文章說,必須要有@EnableScheduling和@Configuration貼在任務(wù)類上面,但是親測發(fā)現(xiàn)去掉亦可. 大概是因?yàn)锧EnableScheduling其實(shí)是springboot本身對于定時功能的支持的自動裝配,與Quartz無關(guān),后面配置已經(jīng)將該任務(wù)類加上,故這里不加這個注解也可以
3.配置類
package com.xuebi.qrtz_demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
/**
* 配置
*
* @author Sprite
* @date 2018/09/06
*/
@Configuration
public class QuartzConfig {
@Bean
public MethodInvokingJobDetailFactoryBean detailFactoryBean(SingleTask task) {
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
jobDetailFactoryBean.setConcurrent(false);
jobDetailFactoryBean.setName("printOut");
jobDetailFactoryBean.setGroup("printOut_group");
jobDetailFactoryBean.setTargetObject(task);
jobDetailFactoryBean.setTargetMethod("singleTask");
return jobDetailFactoryBean;
}
@Bean
public CronTriggerFactoryBean cronTrigger(MethodInvokingJobDetailFactoryBean detailFactoryBean) {
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
triggerFactoryBean.setJobDetail(detailFactoryBean.getObject());
// 設(shè)置表達(dá)式,每3秒執(zhí)行一次
triggerFactoryBean.setCronExpression("0/3 * * * * ?");
triggerFactoryBean.setName("everyThreeSeconds");
return triggerFactoryBean;
}
@Bean
public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean cronTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 設(shè)置是否任意一個已定義的Job會覆蓋現(xiàn)在的Job空免。默認(rèn)為false轨功,即已定義的Job不會覆蓋現(xiàn)有的Job帘皿。
bean.setOverwriteExistingJobs(true);
// 延時啟動许赃,應(yīng)用啟動10秒后凫海,定時器才開始啟動
bean.setStartupDelay(10);
// 注冊定時觸發(fā)器
bean.setTriggers(cronTrigger.getObject());
return bean;
}
}
控制臺輸出結(jié)果
控制臺結(jié)果
看到控制臺的這個結(jié)果,就表示已經(jīng)成功了