• springboot集成Quartz定时任务组件



    前言

    平时开发中相信大家都经常用到定时任务吧,最近简单的就是直接使用@Scheduled注解标注到方法上用注解的方式在项目运行时无法去对任务进行管理。现在开发过程中用得比较多的就是Quartz框架了。下面直接介绍其最常见的使用方式。


    一、Quartz 是什么?

    Quartz 是一个功能强大的开源作业调度库,用于在 Java 应用程序中实现任务调度和定时任务。它提供了灵活的调度机制,可以根据时间表、间隔或条件触发任务的执行。

    下面是对 Java 中 Quartz 的主要概念的简单描述:

    1. 任务(Job): Quartz 中的任务是可以执行的工作单元。你可以创建实现 org.quartz.Job 接口的类,并在其中定义任务的逻辑。

    2. 触发器(Trigger): 触发器用于定义任务何时执行的规则。Quartz 提供了多种类型的触发器,例如简单触发器(SimpleTrigger)和 Cron 触发器(CronTrigger)。你可以配置触发器的执行时间、重复间隔和触发条件等。

    3. 调度器(Scheduler): 调度器是 Quartz 的核心组件,用于管理任务和触发器。它负责根据配置的规则触发任务的执行,并管理任务的调度、暂停、恢复等操作。

    4. 作业存储(Job Store): 作业存储是 Quartz 用于存储任务和触发器信息的持久化机制。它可以将任务和触发器的状态保存在内存中或者在数据库中进行持久化。

    二、使用步骤

    本次示例使用JDBCJobStore(mysql)存储任务的方式实现,这种方式也是实际开发中用得最多的方式

    1. 在你的 Spring Boot 项目中添加 spring-boot-starter-quartz 依赖。

      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-quartzartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
    2. 初始化脚本,org.quartz.impl.jdbcjobstore包下面存放了各数据库初始化脚本,本次实验demo,下载的是tables_mysql_innodb.sql( ps:github 上也提供了脚本,并且也有各种demo。Quartz github 脚本下载地址(mysql_innodb.sql)

    3. 创建一个实现了 org.quartz.Job 接口的任务类,该接口定义了任务的执行逻辑。例如,你可以创建一个名为 MyJob 的类,实现 Job 接口,并重写 execute 方法。

      import org.quartz.Job;
      import org.quartz.JobExecutionContext;
      import org.quartz.JobExecutionException;
      
      public class MyJob implements Job {
          @Override
          public void execute(JobExecutionContext context) throws JobExecutionException {
              // 执行你的任务逻辑
              System.out.println("Hello, Quartz!");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    4. 在你的应用程序中配置 Quartz 调度器和触发器。可以通过创建一个 SchedulerFactoryBean Bean 来配置 Quartz 调度器,并将触发器与任务关联。以下是一个简单的配置示例:

      
      @Component
      public class StartJob {
       @Autowired
       private Scheduler scheduler;
       // 实际开发中,创建任务关键参数,可以通过接口的进行增删改查维护定时任务,这样就可以动态的去控制定时任务了
       @PostConstruct 
       public void start() throws SchedulerException {
         //创建触发器 定义执行频率
         String id = "1111111111111";
         Trigger trigger = TriggerBuilder.newTrigger()
             .withIdentity(id, "group1")
             .withSchedule(cronSchedule("0/20 * * * * ?")).build();
         //创建任务,指定任务处理逻辑
         JobDetail jobDetail = JobBuilder.newJob().ofType(TestJob.class).withIdentity(id).build();
         // 任务信息 存库、存在任务则更新(可以去quartz 相关表里面去看,框架自动把任务信息存到表里面了,
         //下次启动,只要开启了spring.quartz.auto-startup = true ,就能自动扫描quartz_表存的任务信息)
         scheduler.scheduleJob(jobDetail, trigger);
         scheduler.start();
       }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    5. 配置文件

      # 项目启动自动启动定时任务调度
      spring.quartz.auto-startup=true
      spring.quartz.job-store-type=jdbc
      org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      
      • 1
      • 2
      • 3
      • 4

    总结

    以上是Quartz框架基于springboot简单demo,如果你还在springboot中使用@Scheduled注解不妨试一下Quartz定时任务框架
    (需要demo代码的可以评论,私发demo git地址)

  • 相关阅读:
    JWT 使用入门(一)配置与示例
    针对DGL的few-shot数据集划分方法
    如何导出PPT画的图为高清图片?插入到world后不压缩图像的设置方法?
    生态环境影响评价制图流程
    django 自动化脚本的开发 - 脚本仅启动运行一次 / 执行定时任务 - 测试过程
    自定义修改Discuz X3 今日发帖数量 昨日发帖数量 帖子总数 会员总数
    Redis - 分布式锁和事务
    Spring Boot的启动流程
    较难理解的字符串查找算法KMP
    驱动day4
  • 原文地址:https://blog.csdn.net/weixin_39439156/article/details/136517573