# Quartz教程 - 7 SpringBoot集成Quartz
上面使用的是原生的方法演示 Quartz 的时候,但是在实际的使用中,肯定不会像前面那样使用,一般会在 Spring 项目中或 SpringBoot 项目中进行使用,下面演示一下在 SpringBoot 项目中使用 Quartz。
# 1 新建SpringBoot项目
新建 SpringBoot 项目这里就不介绍了。可能你的项目已经是 SpringBoot 的项目了。
# 2 添加依赖
在项目的 pom.xml 中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1
2
3
4
2
3
4
直接使用 starter 的方式集成。
# 3 创建Job
新建一个 MyJob,和之前类似,不过在 SpringBoot 中,可以继承QuartzJobBean。
MyJob.java
package com.doubibiji.springbootquartz.job;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
@Slf4j
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.info("执行定时任务");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
继承 QuartzJobBean
和 实现 Job
接口使用上没什么区别。
在实际使用中,我们可以在 Job 类中注入我们业务 Service 的依赖,这样就可以调用 Service 中的方法,执行业务逻辑了。
# 4 注册Job和Trigger
首先创建一个 Quartz 的配置类,在这个配置类中,创建 JobDetail 和 Trigger,并将他们添加到Spring 容器中。
Quartz.config
package com.doubibiji.springbootquartz.config;
import com.doubibiji.springbootquartz.job.MyJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
/**
* 将Job注册到Spring容器
*/
@Bean
public JobDetail myJob(){
//newJob方法就是在绑定要运行的Job接口实现类,需要实现类的反射做参数
return JobBuilder.newJob(MyJob.class)
// 给当前JobDetail对象在调度环境中起名
.withIdentity("myJob")
// 将JobDetail存储在 Scheduler中,即使没有触发器绑定当前JobDetail对象,也不会被删除
.storeDurably()
.build();
}
// 下面是触发器的声明,也会保存到Spring容器中
@Bean
public Trigger myTrigger(){
// 定义Cron表达式
CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); // 每5秒执行一次
return TriggerBuilder.newTrigger()
// 绑定要运行的JobDetail对象
.forJob(myJob())
.startAt(DateBuilder.futureDate(20, DateBuilder.IntervalUnit.SECOND)) // 延迟20秒执行
// 为触发器起名
.withIdentity("myTrigger")
// 绑定cron表达式
.withSchedule(cron)
.build();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
项目结果如下:
# 5 启动项目
在 Spring Boot 中,使用 spring-boot-starter-quartz
启动器时,Quartz 的 Scheduler 会自动被创建和启动。这是因为 Spring Boot 会自动检测 Quartz 的相关配置,包括 @Configuration
类中的 Bean 定义,然后自动初始化和启动 Quartz。
所以,就无需手动调用 scheduler.start()
来启动 Scheduler。Spring Boot 会在应用启动时自动执行这个任务。
直接启动项目,就可以看到执行的结果: