# 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

直接使用 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

继承 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

项目结果如下:

# 5 启动项目

在 Spring Boot 中,使用 spring-boot-starter-quartz 启动器时,Quartz 的 Scheduler 会自动被创建和启动。这是因为 Spring Boot 会自动检测 Quartz 的相关配置,包括 @Configuration 类中的 Bean 定义,然后自动初始化和启动 Quartz。

所以,就无需手动调用 scheduler.start() 来启动 Scheduler。Spring Boot 会在应用启动时自动执行这个任务。

直接启动项目,就可以看到执行的结果: