• 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项目可以直接引入下面依赖。

    1. org.springframework.boot
    2. spring-boot-starter-quartz

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

    1. org.quartz-scheduler
    2. quartz
    3. 2.2.3

     (2)开发定时任务

    1. package com.example.demo.job;
    2. import org.quartz.JobExecutionContext;
    3. import org.quartz.JobExecutionException;
    4. import org.springframework.scheduling.quartz.QuartzJobBean;
    5. /**
    6. * @Author linaibo
    7. * @Date 2023/11/17 16:52
    8. * @Version 1.0
    9. */
    10. public class SimpleJob extends QuartzJobBean {
    11. @Override
    12. protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    13. System.out.println("执行成功");
    14. }
    15. }

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

    (3)配置定时任务

    1. package com.example.demo.config;
    2. import org.quartz.*;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.ApplicationArguments;
    5. import org.springframework.boot.ApplicationRunner;
    6. import org.springframework.context.annotation.Configuration;
    7. import org.springframework.core.annotation.Order;
    8. /**
    9. * @Author linaibo
    10. * @Date 2023/11/17 16:54
    11. * @Version 1.0
    12. */
    13. @Configuration
    14. @Order(2)
    15. public class QuartzConfig implements ApplicationRunner {
    16. @Autowired
    17. private Scheduler scheduler;
    18. @Override
    19. public void run(ApplicationArguments args) throws Exception {
    20. try{
    21. String cron = "0/5 0/1 * * * ?";
    22. Classextends Job> jobClazz = (Classextends Job>)Class.forName("com.example.demo.job.SimpleJob");
    23. JobDetail jobDetail = JobBuilder.newJob(jobClazz)
    24. .withIdentity("test")
    25. .storeDurably()
    26. .build();
    27. CronTrigger cronTrigger = TriggerBuilder.newTrigger()
    28. .withIdentity("test")
    29. .startNow()
    30. .withSchedule(CronScheduleBuilder.cronSchedule(cron))
    31. .build();
    32. scheduler.scheduleJob(jobDetail, cronTrigger);
    33. } catch (ClassNotFoundException e) {
    34. System.out.println("定时任务类路径出错:请输入类的绝对路径");
    35. } catch (SchedulerException e) {
    36. System.out.println("创建定时任务出错");
    37. }
    38. }
    39. }

    这里使用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)重新定制

    1. @Service
    2. public class QuartzJobServiceImpl implements QuartzJobService {
    3. @Autowired
    4. private Scheduler scheduler;
    5. @SneakyThrows
    6. @Override
    7. public void rescheduleJob(String jobName, String jobGroupName, String cron) {
    8. TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
    9. CronTrigger cronTrigger = TriggerBuilder.newTrigger()
    10. .withIdentity(triggerKey)
    11. .startNow()
    12. .withSchedule(CronScheduleBuilder.cronSchedule(cron))
    13. .build();
    14. scheduler.rescheduleJob(triggerKey, cronTrigger);
    15. }

    (2)恢复

    1. @Service
    2. public class QuartzJobServiceImpl implements QuartzJobService {
    3. @Autowired
    4. private Scheduler scheduler;
    5. @SneakyThrows
    6. @Override
    7. public void resumeJob(String jobName, String jobGroupName) {
    8. scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
    9. }
    10. }

    (3)暂停

    1. @Service
    2. public class QuartzJobServiceImpl implements QuartzJobService {
    3. @Autowired
    4. private Scheduler scheduler;
    5. @SneakyThrows
    6. @Override
    7. public void pauseJob(String jobName, String jobGroupName) {
    8. scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));
    9. }
    10. }

    (4)删除

    1. @Service
    2. public class QuartzJobServiceImpl implements QuartzJobService {
    3. @Autowired
    4. private Scheduler scheduler;
    5. @SneakyThrows
    6. @Override
    7. public void deleteJob(String jobName, String jobGroupName) {
    8. scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
    9. scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
    10. scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
    11. }
    12. }

    参照:

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

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

  • 相关阅读:
    vue使用pdf 导出当前页面,(jspdf, html2canvas )
    10 编译2022年最新的U-Boot源码,并用QEMU模拟器运行
    DHCP(自动分配ip地址实验案例)
    SpringBoot整合Docker实现一次构建到处运行
    如何实现安全密码历史记录
    Java面试题大全带答案
    离线安装mysql
    【SA8295P 源码分析 (三)】126 - 摄像头 POC (Power over Coax) 同轴电缆供电技术原理分析
    jdk 下载 ,开发工具下载 [jdk1.8.0_251.zip]
    乐盟互动申请纳斯达克IPO上市,募资2000万美元
  • 原文地址:https://blog.csdn.net/m0_72167535/article/details/134469154