ApiBoot
内部集成了Quartz
,提供了数据库方式
、内存方式
的进行任务的存储,其中数据库
方式提供了分布式集群任务调度
,任务自动平滑切换执行节点。java
在pom.xml
配置文件内添加,以下配置:git
<!--ApiBoot Quartz-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-quartz</artifactId>
</dependency>
复制代码
备注:若是使用
ApiBoot Quartz
的内存方式,仅须要添加上面的依赖便可。github
参数名称 | 是否必填 | 默认值 | 描述 |
---|---|---|---|
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
api:
boot:
quartz:
# Jdbc方式
job-store-type: jdbc
复制代码
Quartz
的数据库方式内部经过DataSource
获取数据库链接对象来进行操做数据,所操做数据表的表结构是固定的,ApiBoot
把Quartz
所支持的全部表结构都进行了整理,访问Quartz支持数据库建表语句列表查看,复制执行对应数据库语句便可。app
咱们只须要让新建类集成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
类型数据。ide
ApiBoot Quartz
的newJob
方法所建立的定时任务,若是在不传递Job Key
参数时,会默认使用UUID
随机字符串做为Job Key
以及Trigger Key
。oop
任务开始时间能够经过startAtTime
方法进行设置,在不设置的状况下,任务建立完成后会马上执行。测试
建立Cron
类型任务以下所示:
String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context()
.jobClass(DemoJob.class)
.cron("0/5 * * * * ?")
.param(
ApiBootJobParamWrapper.wrapper().put("param", "测试"))
.wrapper());
复制代码
Cron 表达式任务由ApiBootCronJobWrapper
类进行构建。
上面的DemoJob
任务类将会每隔5秒
执行一次。
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
一次性任务,任务执行一次会就会被自动释放,以下所示:
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
表达式的场景以下:
修改方法以下所示:
// 修改执行Job Key任务的Cron表达式
apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?");
复制代码
想要手动释听任务时可使用以下方式:
// 手动删除指定Job Key任务
apiBootQuartzService.deleteJob(jobKey);
// 手动删除多个任务
apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey);
复制代码
删除任务的顺序以下: