Maven依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>

集群模式代码

Scheduler对象由Springboot提供,直接注入得到

Quartz集群基于数据库,存储类型必须以jdbc,不需要类似注册中心的服务

配置文件

如果要持久化任务就要配置数据库,quartz会自动生成表
建议提前将quartz提供的表生成好

server:
  port: 8101

spring:
 # 整合数据库
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/quartz_study?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
    username: root
    password: 1234
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
                  # 集群名字 会以集群区分
            instanceName: DefaultQuartzScheduler
            # 节点id 集群内唯一
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            # 表前缀 针对数据库编码问题要注意大小写
            tablePrefix: QRTZ_
             # 为true 开启集群模式
            isClustered: false
            clusterCheckinInterval: 10000
            useProperties: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
    #数据库方式
    job-store-type: jdbc
    #初始化表结构 never表示不自动生成
    jdbc:
      initialize-schema: never

Job类

不用实现Job接口,继承QuartzJobBean抽象类,QuartzJobBean底层实现了Job接口
用法和Job接口差不多

自动关联Trigger和JobDetail

Spring Boot 的quartz的starter自带了Scheduler的Bean对象
创建JobDetail和Trigger的Bean对象,Spring会自动关联
但个人不推荐这样,因为通常来说如果用任务调度,会需要很多的job

@Configuration
public class JobConfig {

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(SpringJob.class)
                .withIdentity("SpringJob", "group1")
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger trigger() {
        return TriggerBuilder.newTrigger()
                .withIdentity("SpringTrigger", "group1")
                .startNow()
//                与job关联
                .forJob(jobDetail())
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("0/2 * * * * ? ")
                )
                .build();
    }

}

偏原生写法(推荐)

还是推荐偏原生的写法,写在方法里面好一点,写在Service层代码封装,更加灵活
不推荐以Bean对象进行任务执行

    @Autowired
    public Scheduler scheduler;


    public void startJob() throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(SpringJob.class).build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .startNow()
                .build();

        scheduler.scheduleJob(jobDetail, trigger);
    }

数据库表

根据配置的数据库找到对应数据库的sql然后执行,也可以手动添加表
可以根据导入的maven依赖找
image.png
找到这个mysql_innodb
image.png
上面的配置文件已经配置了数据库,配置数据库 就会把job trigger scheduler记录下来

在数据库表中直接删除job

依次删除表
QRTZ_CRON_TRIGGERS、
QRTZ_SIMPLE_TRIGGERS、
QRTZ_TRIGGERS、
QRTZ_JOB_DETAILS
删除对应的job数据即可