jeebiz-cloud-base-quartz

一、Quartz 简介

Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
Quartz 其实就是通过一个调度线程不断的扫描数据库中的数据来获取到那些已经到点要触发的任务,然后调度执行它的。这个线程就是 QuartzSchedulerThread类。其run方法中就是quartz的调度逻辑。
另外,这是一个Demo,木有考虑并发、多任务执行等等状态的发生及处理情况,见谅。

1.1、Quartz 概念

Quartz 的几个核心概念

  • Job 表示一个工作,要执行的具体内容。此接口中只有一个方法:void execute(JobExecutionContext context)
  • JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
  • Trigger 代表一个调度参数的配置,什么时候去调。
  • Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。

二、SpringBoot 使用 Quartz

2.1、基本步骤

基本要求:JDK 8、SpringBoot、MybatisPlus、Quartz

导入相关依赖:

<!-- For Quartz -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
</dependency>

模块结构:

2.2、执行 Quartz 需要的SQL文件

找到 quartz 需要的 sql 文件,在数据库中执行,这也是 Quartz持久化的基础~

org.quartz.impl.jdbcjobstore 包目录下,找到你需要的sql文件。

因为我本地使用MySQL数据库,所以,我选择 tables_mysql_innodb.sql

  • 如果是独立的任务服务,需要首先创建数据库,例: quartz_job
  • 将文件中的SQL拷贝到数据库中执行
  • 执行完的结果:

为了方便与业务的整合,在此基础上,我们再额外增加一张表

DROP TABLE IF EXISTS `qrtz_job_list`;
CREATE TABLE `qrtz_job_list`  (
   `id` varchar(32) NOT NULL,
   `job_class_name` varchar(255) DEFAULT NULL COMMENT '任务类名',
   `cron_expression` varchar(255) DEFAULT NULL COMMENT 'cron表达式',
   `parameter` varchar(255) DEFAULT NULL COMMENT '参数',
   `description` varchar(255) DEFAULT NULL COMMENT '描述',
   `status` int(1) NULL DEFAULT NULL COMMENT '状态 0正常 -1停止',
   `is_deleted` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)',
   `creator` bigint(12) DEFAULT 0 COMMENT '创建人ID',
   `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `modifyer` bigint(12) DEFAULT NULL COMMENT '修改人ID',
   `modify_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务清单表';

另外在这里顺带补充一下,本项目在yml中配置quartz,如下:

spring:
  ## quartz定时任务,采用数据库方式
  quartz:
    job-store-type: jdbc

2.6、简单的 Job 案例

如果调度器要执行任务,首先得要有一个任务相关滴类。

写了两个平常的案例,一个是不带参数的,一个是带参数的。

/**
 * 不带参的简单定时任务
 * @Author nzc
 */
@Slf4j
public class SampleJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        log.info(String.format("Ning zaichun的 普通定时任务 SampleJob !  时间:" + new Date()));
    }
}

2.7、那么该如何使用呢?

启动项目,让我们拿起来postman来测试吧,康康该如何使用,数据表在使用的时候,又有怎么样的变化~

我们直接来测试添加定时任务的接口,先来个不用参数的吧

{
“createBy”: “nzc”,
“jobClassName”: “com.nzc.quartz.job.SampleJob”,
“cronExpression”: “0/10 * * * * ? “,
“description”: “每十秒执行一次”,
“status”: “0”
}

添加完之后就已经在执行了。

此时我们将项目停止,重新启动~

带参数的

 /**
  * 带参数的简单的定时任务
  * @Author nzc
  */
 @Slf4j
 public class SampleParamJob implements Job {
     /**
      * 若参数变量名修改 QuartzJobController中也需对应修改
      */
     private String parameter;

     public void setParameter(String parameter) {
         this.parameter = parameter;
     }

     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         log.info(String.format("welcome %s! Jeecg-Boot 带参数定时任务 SampleParamJob !   时间:" + LocalDateTime.now(), this.parameter));
     }
 }

参考:https://zhuanlan.zhihu.com/p/553289804?utm_id=0

作者:Jeebiz  创建时间:2023-12-20 16:58
最后编辑:Jeebiz  更新时间:2023-12-20 20:07