开头
springboot本身就自带了一个定时任务,只需要加两个注解即完事,但是不知是我能力原因还是本身框架就是如此,我不知如何暂停springboot自带的定时任务。但是quartz可以暂停,它十分灵活,甚至可以将任务与调度器存进数据库中,灵活配置。该篇博客直接讲述quartz如何整合springboot,但是我推荐大家整合前还是先了解一下quartz原本如何使用,以及quartz如何整合ssm,不然初学者直接quartz整合springboot将会难以理解job与trigger的概念已经之间的关联。如果想要学习quartz以及quartz整合ssm(包括持久化配置)可以看我的quartz笔记
maven依赖
顺便一提,quartz整合springboot有两种方式,一种是ssm如何整合,springboot就如何整合,另一种是使用spring-boot-starter-quartz的方式。
毕竟spring-boot-starter-quartz是springboot的亲儿子,所以该篇博客使用第二种的整合方式
maven坐标
<!--quartz-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
创建一个任务类
/**
* @Author VULCAN
* @create 2020/3/12 16:10
*/
@DisallowConcurrentExecution //如果不想使用并发的方式执行,可以添加这个注解
public class RealJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("我是正统的springboot——quartz整合方式");
}
}
其实这个类也可以继承 Job 当配置完成运行的时候,并没有影响。
基于内存的配置
创建一个配置类
/**
* @Author VULCAN
* @create 2020/3/12 16:13
*/
@Configuration
public class RealQuartzConfig {
@Bean //job配置
JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
jobDetailFactoryBean.setJobClass(RealJob.class);
return jobDetailFactoryBean;
}
@Bean //调度器配置
CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean().getObject());
cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
return cronTriggerFactoryBean;
}
@Bean //中心配置
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(cronTriggerFactoryBean().getObject());
return schedulerFactoryBean;
}
@Bean(name="Scheduler") //获得可以操作定时任务的对象
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}
结果如下
每两秒执行一次
持久化配置
持久化配置就是将job与trigger扔给数据库去存储,不再放入内存中。持久化配置后如果想要修改配置,既可以通过修改数据表中的数据就可以实现不同的效果,十分的灵活,也支持动态的添加修改job与trigger。
maven依赖
因为是基于数据库配置的,所以还需要再添加两个依赖
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
创建配置类
持久化配置不需要配置任务job与调度器trigger,因为这些都是写在数据库表中的。
/**
* @Author VULCAN
* @create 2020/3/12 16:13
*/
@Configuration
public class RealQuartzConfig {
@Bean //中心配置
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setDataSource(datasource());
return schedulerFactoryBean;
}
@Bean(name="Scheduler") //获得可以操作定时任务的对象
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
@Bean //数据库连接池
public DruidDataSource datasource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8&useSSL=false\n");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
druidDataSource.setMaxActive(20);
druidDataSource.setMaxWait(6000);
druidDataSource.setInitialSize(1);
return druidDataSource;
}
}
添加一个任务与触发器进数据库表中
@SpringBootTest
class QuartzbybootApplicationTests {
@Autowired
@Qualifier("Scheduler")
private Scheduler scheduler;
@Test
public void addJob() throws SchedulerException, InterruptedException {
//创建JobDetail实例
JobDetail jobDetail = JobBuilder.newJob(RealJob.class)
.withIdentity("job-boot", "job-boot-group").storeDurably(true).build();
//创建Trigger实例 每5秒执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger-boot", "triggerGroup-boot")
.withSchedule(CronScheduleBuilder.cronSchedule("5/5 * * * * ?")).build();
//执行
scheduler.scheduleJob(jobDetail, trigger);//绑定 如果配置了持久化,那这个就是将任务与调度器添加进数据表中
Thread.sleep(20000); //线程睡眠,以看到添加后的结果
}
}
添加后结果如下
表数据如下
qrtz_cron_triggers
qrtz_job_details
qrtz_triggers