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!