乐趣区

ApiBoot – ApiBoot Quartz 使用文档

ApiBoot Quartz
ApiBoot 内部集成了 Quartz,提供了数据库方式、内存方式的进行任务的存储,其中数据库方式提供了分布式集群任务调度,任务自动平滑切换执行节点。
引用 ApiBoot Quartz
在 pom.xml 配置文件内添加,如下配置:
<!–ApiBoot Quartz–>
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-quartz</artifactId>
</dependency>
备注:如果使用 ApiBoot Quartz 的内存方式,仅需要添加上面的依赖即可。
相关配置

参数名称
是否必填
默认值
描述

api.boot.quartz.job-store-type

memory
任务存储源方式,默认内存方式

api.boot.quartz.scheduler-name

scheduler
调度器名称

api.boot.quartz.auto-startup

true
初始化后是否自动启动调度程序

api.boot.quartz.startup-delay

0
初始化完成后启动调度程序的延迟。

api.boot.quartz.wait-for-jobs-to-complete-on-shutdown

false
是否等待正在运行的作业在关闭时完成。

api.boot.quartz.overwrite-existing-jobs

false
配置的作业是否应覆盖现有的作业定义。

api.boot.quartz.properties

Quartz 自定义的配置属性,具体参考 quartz 配置

api.boot.quartz.jdbc

配置数据库方式的 Jdbc 相关配置

内存方式
ApiBoot Quartz 在使用内存方式存储任务时,不需要做配置调整。
数据库方式
需要在 application.yml 配置文件内修改 api.boot.quartz.job-store-type 参数,如下所示:
api:
boot:
quartz:
# Jdbc 方式
job-store-type: jdbc
Quartz 所需表结构
Quartz 的数据库方式内部通过 DataSource 获取数据库连接对象来进行操作数据,所操作数据表的表结构是固定的,ApiBoot 把 Quartz 所支持的所有表结构都进行了整理,访问 Quartz 支持数据库建表语句列表查看,复制执行对应数据库语句即可。
创建任务类
我们只需要让新建类集成 QuartzJobBean 就可以完成创建一个任务类,如下简单示例:
/**
* 任务定义示例
* 与 Quartz 使用方法一致,ApiBoot 只是在原生基础上进行扩展,不影响原生使用
* <p>
* 继承 QuartzJobBean 抽象类后会在项目启动时会自动加入 Spring IOC
*
* @author:恒宇少年 – 于起宇
* <p>
* DateTime:2019-03-28 17:26
* Blog:http://blog.yuqiyu.com
* WebSite:http://www.jianshu.com/u/092df3f77bca
* Gitee:https://gitee.com/hengboy
* GitHub:https://github.com/hengboy
*/
public class DemoJob extends QuartzJobBean {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(DemoJob.class);

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info(“ 定时任务 Job Key:{}”, context.getJobDetail().getKey());
logger.info(“ 定时任务执行时所携带的参数:{}”, JSON.toJSONString(context.getJobDetail().getJobDataMap()));
//… 处理逻辑
}
}
任务参数
在任务执行时传递参数是必须的,ApiBoot Quartz 提供了比较方便的传递方式,不过最终 Quartz 会把传递的值都会转换为 String 类型数据。
任务 Key 默认值
ApiBoot Quartz 的 newJob 方法所创建的定时任务,如果在不传递 Job Key 参数时,会默认使用 UUID 随机字符串作为 Job Key 以及 Trigger Key。
自定义任务开始时间
任务开始时间可以通过 startAtTime 方法进行设置,在不设置的情况下,任务创建完成后会立刻执行。
Cron 表达式任务
创建 Cron 类型任务如下所示:
String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context()
.jobClass(DemoJob.class)
.cron(“0/5 * * * * ?”)
.param(
ApiBootJobParamWrapper.wrapper().put(“param”, “ 测试 ”))
.wrapper());
Cron 表达式任务由 ApiBootCronJobWrapper 类进行构建。
上面的 DemoJob 任务类将会每隔 5 秒执行一次。
Loop 重复任务
Loop 循环任务,当在不传递重复执行次数时,不进行重复执行,仅仅执行一次,如下所示:
String jobKey = apiBootQuartzService.newJob(
ApiBootLoopJobWrapper.Context()
// 参数
.param(
ApiBootJobParamWrapper.wrapper()
.put(“userName”, “ 恒宇少年 ”)
.put(“userAge”, 24)
)
// 每次循环的间隔时间,单位:毫秒
.loopIntervalTime(2000)
// 循环次数
.repeatTimes(5)
// 开始时间,10 秒后执行
.startAtTime(new Date(System.currentTimeMillis() + 10000))
// 任务类
.jobClass(DemoJob.class)
.wrapper()
);
Loop 任务由 ApiBootLoopJobWrapper 类进行构建。
上面的定时任务将会重复执行 5 次,连上自身执行的一次也就是会执行 6 次,每次的间隔时间为 2 秒,在任务创建 10 秒后进行执行。
Once 一次性任务
Once 一次性任务,任务执行一次会就会被自动释放,如下所示:

Map paramMap = new HashMap(1);
paramMap.put(“paramKey”, “ 参数值 ”);

String jobKey = apiBootQuartzService.newJob(
ApiBootOnceJobWrapper.Context()
.jobClass(DemoJob.class)
// 参数
.param(
ApiBootJobParamWrapper.wrapper()
.put(“mapJson”, JSON.toJSONString(paramMap))
)
// 开始时间,2 秒后执行
.startAtTime(new Date(System.currentTimeMillis() + 2000))
.wrapper()
);

Once 任务由 ApiBootOnceJobWrapper 类进行构建。
在参数传递时可以是对象、集合,不过需要进行转换成字符串才可以进行使用。
暂停任务执行
任务在执行过程中可以进行暂停操作,通过 ApiBoot Quartz 提供的 pauseJob 方法就可以很简单的实现,当然暂停时需要传递 Job Key,Job Key 可以从创建任务方法返回值获得。
暂停任务如下所示:
// 暂停指定 Job Key 的任务
apiBootQuartzService.pauseJob(jobKey);
// 暂停多个执行中任务
apiBootQuartzService.pauseJobs(jobKey,jobKey,jobKey);
恢复任务执行
任务执行完暂停后,如果想要恢复可以使用如下方式:
// 恢复指定 Job Key 的任务执行
apiBootQuartzService.resumeJob(jobKey);
// 恢复多个暂停任务
apiBootQuartzService.resumeJobs(jobKey,jobKey,jobKey);
修改 Cron 表达式
修改 Cron 表达式的场景如下:

已创建 & 未执行
已创建 & 已执行

修改方法如下所示:
// 修改执行 Job Key 任务的 Cron 表达式
apiBootQuartzService.updateJobCron(jobKey, “0/5 * * * * ?”);
删除任务
想要手动释放任务时可以使用如下方式:
// 手动删除指定 Job Key 任务
apiBootQuartzService.deleteJob(jobKey);
// 手动删除多个任务
apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey);
删除任务的顺序如下:

暂停触发器
移除触发器
删除任务

本章源码地址:https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-quartz

退出移动版