首先我们导入依赖
1. 使用springboot在导包的时候首先应该想到看看官网是否有spring-boot-starter-* 类似的官方包
2. 其次再看是否有 *-boot-starter 这种第三方包
- 像quartz这种最常用的调度任务包springboot已经在官网默认集成了
- 例如在官网文档中有如下图链接
- 有该配置类说明就有quartz的官方starter包 我们直接引入即可(2.1.6)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- 添加配置类
- 首先spring使用FactoryBean(不要与BeanFactory混淆了)去创建特殊的bean ,
- 在spring中实现了两种与jobDetail有关的FactoryBean,一种JobDetailFactoryBean,一种MethodInvokingJobDetailFactoryBean 这两种的目的其实都是通过工厂创建jobDetail(job的定义类)
-
首先我们使用MethodInvokingJobDetailFactoryBean去集成quartz
- 第一步:定义quartz配置类
@Configuration
public class QuartzConfig {
}
- 第二步:在配置类中添加bean
/**
* 定义job
*
* @return
*/
@Bean
public MethodInvokingJobDetailFactoryBean ctsJobDetail(Job job) {
MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
factoryBean.setGroup("job");
factoryBean.setName("run"); //定义job类中的方法名
factoryBean.setTargetObject(job); //目标类也就是要执行job的类
factoryBean.setTargetMethod("exec");
factoryBean.setConcurrent(false);
return factoryBean;
}
- 第三步: 定义一个普通类
@Component
public class Job {
public void run() {
System.out.println("我是job");
}
}
- 在quartz配置类定义Trigger(与上面类似spring中也定义了两种Trigger的FactoryBean)(我们使用CronTriggerFactoryBean
)
@Bean("ctsTriggerFactoryBean")
public CronTriggerFactoryBean ctsTriggerFactoryBean(MethodInvokingJobDetailFactoryBean ctsJobDetail) {
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setName("ctsTrigger");
cronTriggerFactoryBean.setJobDetail(ctsJobDetail.getObject());
cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? ");
return cronTriggerFactoryBean;
}
-
按理来说我们还应该定义SchedulerFactoryBean调度器,但是springboot自动配置已经配置了默认调度器(所以我们无需配置)
这样我们就可以直接运行启动应用进行调度任务执行 -
但是使用MethodInvokingJobDetailFactoryBean虽然简单但是在使用quart jdbc模式时候会报无法序列化问题
-
因此我们使用第二种JobDetailFactoryBean
-
第一步定义JobDetailFactoryBean
@Bean(name = "jobDetail1")
public JobDetailFactoryBean jobDetail1(){
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
jobDetailFactoryBean.setJobClass(Job.class);
jobDetailFactoryBean.setDurability(true);
jobDetailFactoryBean.setName("job1");
jobDetailFactoryBean.setGroup("job1");
return jobDetailFactoryBean;
}
- 第二步: 定义job类(必须继承QuartzJobBean)
@DisallowConcurrentExecution //不开启并发
public class FillUpPhysicalStrengthHandler extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("1");
}
}
- 第三步:定义Trigger(与上边类似)
@Bean(name = "cronTriggerFactoryBean1")
public CronTriggerFactoryBean cronTriggerFactoryBean1 (@Qualifier(value = "jobDetail1") JobDetailFactoryBean jobDetail1) {
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setJobDetail(jobDetail1.getObject());
cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? ");
return cronTriggerFactoryBean;
}
- 第四步: 配置application
spring:
quartz:
job-store-type: jdbc #使用数据库存储定时任务
jdbc:
initialize-schema: always
overwrite-existing-jobs: true #每次重启覆盖原有jobs
- 第五步 : 执行数据库脚本 导入quartz需要的表,在\org\quartz-scheduler\quartz\2.3.1\quartz-2.3.1.jar!\org\quartz\impl\jdbcjobstore 下有各种sql脚本按自己数据库导入即可。