spring boot集成quartz

目录

1.定时任务实现

2.quartz说明

3.存储方式

4.示例

5.定时任务的重新定制,恢复,暂停及删除


1.定时任务实现

定时任务的实现方式有很多,如下:

1.启动类中添加@EnableScheduling,开启定时任务功能,然后通过注解的方式,如

@Scheduled(cron = "0/1 * * * * ?")设置定时任务的执行方式,定时任务要设置成一个spring容器的bean

2.通过第三方框架的方式,如xxl-job,elastic-Job

3.通过quartz方式,第三方的框架也是基于quartz实现的。

2.quartz说明

quartz是完全有java开发的作业调度框架,包含一下几个核心概念:

(1)Scheduler

是quartz中的任务调度器,通过trigger和jobdetail进行调度,暂停和删除任务,相当于一个容器,装载着任务和触发器。Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。

(2)trigger

Quartz 中的触发器,是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTriggerCronTrigger 这两个子类。

(3)jobDetail

Quartz 中需要执行的任务详情,包括了任务的唯一标识和具体要执行的任务,可以通过 JobDataMap 往任务中传递数据。

(4)job

Quartz 中具体的任务,包含了任务的具体实现逻辑。

(5)JobBuilder

用于创建一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。

(6)TriggerBuilder

触发器创建器,用于创建触发器trigger实例。

(7)监听器组件

JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。

3.存储方式

(1)RAMJobStore

默认情况下 Quartz 会将任务调度存储在内存中,这种方式性能是最好的,因为内存的速度是最快的。不好的地方就是数据缺乏持久性,但程序崩溃或者重新发布的时候,所有运行信息都会丢失。

(2)数据库方式

存储数据库后,可以做单点也可以做集群,当任务多了之后,可以统一进行管理,随时停止、暂停、修改任务。 关闭或者重启服务器,运行的信息都不会丢失。缺点就是运行速度快慢取决于连接数据库的快慢。

4.示例

(1)引入依赖

springboot项目可以直接引入下面依赖。

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

非springboot项目引入下面依赖,当然springboot项目也可以使用此依赖

java 复制代码
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
</dependency>

(2)开发定时任务

java 复制代码
package com.example.demo.job;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * @Author linaibo
 * @Date 2023/11/17 16:52
 * @Version 1.0
 */
public class SimpleJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("执行成功");
    }
}

定时任务继承QuartzJobBean,并实现其方法。

(3)配置定时任务

java 复制代码
package com.example.demo.config;

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

/**
 * @Author linaibo
 * @Date 2023/11/17 16:54
 * @Version 1.0
 */
@Configuration
@Order(2)
public class QuartzConfig implements ApplicationRunner {
    @Autowired
    private Scheduler scheduler;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        try{
            String cron = "0/5 0/1 * * * ?";
            Class<? extends Job> jobClazz = (Class<? extends Job>)Class.forName("com.example.demo.job.SimpleJob");
            JobDetail jobDetail = JobBuilder.newJob(jobClazz)
                    .withIdentity("test")
                    .storeDurably()
                    .build();

            CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                    .withIdentity("test")
                    .startNow()
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .build();

            scheduler.scheduleJob(jobDetail, cronTrigger);
        } catch (ClassNotFoundException e) {
            System.out.println("定时任务类路径出错:请输入类的绝对路径");
        } catch (SchedulerException e) {
            System.out.println("创建定时任务出错");
        }

    }
}

这里使用ApplicationRunner,简单说明一下:

ApplicationRunner常用于项目启动后,(也就是ApringApplication.run()执行结束),立马执行某些逻辑。可用于项目的准备工作,比如加载配置文件,加载执行流,定时任务等等。

使用方式:

实现ApplicationRunner接口,重写run方法,定义具体的执行逻辑

@Order注解,用于决定多个bean的执行顺序,按照值从小到大执行 (值可为负数)

@Order(-1)优先于@Order(0)

@Order(1)优先于@Order(2)

还有个接口,也可以实现和ApplicationRunner一样的功能

CommandLineRunner

CommandLineRunner接口的run方法接收的参数为String数组

创建配置文件实现ApplicationRunner接口,实现run方法,在方法中,首先通过反射方式获取到要执行定时任务的类来创建jobdetail,然后根据执行规则创建执行的触发器trigger,再将jobdetail和trigger放到scheduler容器中,按照规则进行任务的执行。

定时任务的全路径名称,执行的触发器以及任务名称,可以存放在数据库中,并在前端追加可视化画面来进行修改,删除及立即执行的功能。

定时任务的数据表可以自己设计,也可以参照官网,如下

初始化 Quartz 数据表

下载 Quartz 发布包:Downloads

解压缩进入SQL脚本所在位置:quartz-2.3.0-SNAPSHOT/src/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql

导入 tables_mysql_innodb.sql 脚本文件。

5.定时任务的重新定制,恢复,暂停及删除

(1)重新定制

java 复制代码
@Service
public class QuartzJobServiceImpl implements QuartzJobService {

    @Autowired
    private Scheduler scheduler;

    @SneakyThrows
    @Override
    public void rescheduleJob(String jobName, String jobGroupName, String cron) {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();
        scheduler.rescheduleJob(triggerKey, cronTrigger);
    }

(2)恢复

java 复制代码
@Service
public class QuartzJobServiceImpl implements QuartzJobService {

    @Autowired
    private Scheduler scheduler;
    
    @SneakyThrows
    @Override
    public void resumeJob(String jobName, String jobGroupName) {
        scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
    }
}

(3)暂停

java 复制代码
@Service
public class QuartzJobServiceImpl implements QuartzJobService {

    @Autowired
    private Scheduler scheduler;

    @SneakyThrows
    @Override
    public void pauseJob(String jobName, String jobGroupName) {
        scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));
    }
}

(4)删除

java 复制代码
@Service
public class QuartzJobServiceImpl implements QuartzJobService {

    @Autowired
    private Scheduler scheduler;

    @SneakyThrows
    @Override
    public void deleteJob(String jobName, String jobGroupName) {
        scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
        scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
        scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
    }
}

参照:

Spring Boot 集成 Quartz(任务调度框架)_springboot集成quartz_人人都在发奋的博客-CSDN博客

springboot整合quartz项目使用(含完整代码)_springboot quartz-CSDN博客

相关推荐
追逐时光者2 分钟前
6种流行的 API 架构风格,你知道几种?
后端
咸鱼求放生6 分钟前
网络请求只到前端页面接口报200并到不到后端接口
java
只会AI搜索得coder13 分钟前
sqlite3 sqlcipher加密,解密,集成springboot,读取sqlcipher加密工具
java·spring boot·sqlite
小麦果汁吨吨吨21 分钟前
Flask快速入门
后端·python·flask
kinlon.liu24 分钟前
SpringBoot整合Redis限流
spring boot·redis·后端
cg501744 分钟前
Spring Boot 中的自动配置原理
java·前端·数据库
纪元A梦1 小时前
华为OD机试真题——跳格子3(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
IT乐手1 小时前
Java 实现回调监听工具类
java
IT瘾君2 小时前
Java基础:Stream流操作
java
码里看花‌2 小时前
Reactor Core 中的 Flux:响应式数据流的核心实践
java