后端开发
定时任务模块

S7 定时任务模块(可选)

定时任务模块,可以在指定的时间点执行任务,也可以按照指定的时间间隔执行任务。支持秒级定时任务。

本模块是 S7 系统的可选模块,如果不需要定时任务功能,可以不安装本模块。

如果要移除该模块,可以在 ais 模块的 pom.xml 中移除 job 模块的依赖,然后重新编译 ais 模块即可。

模块依赖于 quartz-2.3.2

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

配置部分在 application.yml 中,如下:

spring:
  quartz:
    job-store-type: jdbc # 使用数据库存储任务
    wait-for-jobs-to-complete-on-shutdown: true # 程序结束时会等待quartz相关的内容结束
    overwrite-existing-jobs: true # QuartzScheduler启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录
    properties:
      org:
        quartz:
          scheduler:
            instanceName: scheduler  # 实例名称
            instanceId: AUTO # 实例ID
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 方言实现类
            tablePrefix: QRTZ_ # 表名前缀
            useProperties: false # 是否使用属性
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool # 线程池实现类
            threadCount: 10 # 线程数量
            threadPriority: 5 # 线程优先级
            threadsInheritContextClassLoaderOfInitializingThread: true # 是否继承类加载器

数据库如果自动序列化建表不成功,可以在 quartz-2.3.2.jar!org/quartz/impl/jdbcjobstore 找到不同数据库类型的建表语句,手动建表,如 MySQL 建表脚本 tables_mysql.sql

该文件已经提取出来(版本),放在 jobs 仓库 docs 目录下 tables_mysql.sql

S7与定时任务的集成

鉴于 定时任务 的特殊性,建议该模块单独部署,因为 自定义 任务实现类,需要在 执行节点 上存在,以避免任务执行失败。

S7 产品在原则上与定时任务模块是解耦的。定时任务作为一个可选模块,可以在 S7 产品中独立使用,也可以与 S7 产品集成使用。 当定时任务模块与 S7 集成后,可以在定时任务中执行一些 S7 中定义的任务接口实现类。

S7 定时任务接口类的定义

package com.yonyouaud.jobs.beans;
 
import java.util.Map;
 
import org.quartz.JobExecutionContext;
 
/**
 * 具体任务执行器的接口
 */
public interface JobExecutor {
    void run(JobExecutionContext context, Map<String, Object> data);
}

如果有个性化的执行逻辑,请实现该接口,无需注册类,仅需要保证该类在执行节点 ClassPath 中即可。

定时任务的配置

新增定时任务

S7 系统中,可以通过 API 方式新增定时任务,也可以通过 WEB 界面新增一些内置的定时任务。

curl -X POST -H "token: API-Key"  -H "accept: */*" -H "Content-Type: application/json" -d "{ \"cronExpression\": \"0/5 * * * * ?\", \"description\": \"测试定时任务\", \"jobName\": \"testJob\", \"jobGroupName\": \"testGroup\",  \"data\": { \"clazz\": \"test.Test\" }}" http://localhost:8080/ais/api/v1/jobs/addJob

其中参数是 JobInfo 实体对象

public class JobInfo {
    String jobName; // 任务名称
    String jobGroupName; // 任务分组
    String cronExpression; // CRON 表达式
    Map<String, Object> data; // 扩展参数,如果需要执行个性化类,请保证data中包含参数 clazz,该参数为个性化类的全限定名
    String description; // 任务描述
}

更新定时任务

curl -X GET -H "token: API-Key"  -H "accept: */*" -H "Content-Type: application/json" http://localhost:8080/ais/api/v1/jobs/updateJob?jobName=xxx&groupName=yyy&cron=zzz

删除定时任务

curl -X GET -H "token: API-Key"  -H "accept: */*" -H "Content-Type: application/json" http://localhost:8080/ais/api/v1/jobs/deleteJob?jobName=xxx&groupName=yyy

暂停、启动定时任务

curl -X GET -H "token: API-Key" -H "accept: */*" -H "Content-Type: application/json" http://localhost:8080/ais/api/v1/jobs/pauseJob?jobName=xxx&groupName=yyy
 
curl -X GET -H "token: API-Key" -H "accept: */*" -H "Content-Type: application/json" http://localhost:8080/ais/api/v1/jobs/resumeJob?jobName=xxx&groupName=yyy

立即执行定时任务

curl -X GET -H "token: API-Key" -H "accept: */*" -H "Content-Type: application/json" http://localhost:8080/ais/api/v1/jobs/triggerJob?jobName=xxx&groupName=yyy

如果引入了 jobs 模块,可以直接使用 com.yonyouaud.jobs.service.impl.QuartzServiceImpl 服务类来操作定时任务。

CRON 表达式

可以参考 Cron表达式说明 (opens in a new tab) 了解如何设置 CRON 表达式

也可以通过 Cron 表达式生成器 (opens in a new tab) 生成 CRON 表达式。

其实在设置定时任务的设置界面时,也可以参考 Cron 表达式生成器 (opens in a new tab) 来设计

have fun!