在微服务环境下,定时任务也需要独立为一个服务。这里使用spring+quartz搭建定时任务开发环境。
在Config加载quartz.properties配置文件时,本地环境因为资源文件我们都存放在项目resource下,可使用ClassPathResource去拿到资源文件。可是在集成、测试、生产环境下,一般会把配置文件都拿出来统一放在项目外的一个文件中,而ClassPathResource会从项目根目录下开始查找资源,于是会拿不到项目外的quartz.properties,导致定时任务执行可能会与预期结果不一致,尤其是在集群环境中。读取资源文件可采用PathResouce读取配置文件的绝对路径。
我们将调度信息存储在mysql中,按照quartz规范在数据库建立QRTZ_JOB_DETAILS,QRTZ_TRIGGERS等共11张表。建表sql可在quartz发型包中/docs/dbTables里看到。配置
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
quartz.properties有几个配置可以注意下。集群的配置
org.quartz.jobStore.isClustered = true 开启集群特性
org.quartz.jobStore.clusterCheckinInterval = 20000 设置Scheduler实例节点检测频率,节点出现问题会被发现
org.quartz.jobStore.misfireThreshold = 60000 设置定时任务失火阈值,当前时间超过原定执行时间若是在阈值之内,就可以执行
新建一个任务表用于存放我们配置要执行的任务信息quartz_config表,任务(组)名,触发器(组)名,执行类,cron表达式等,可以在前端页面对任务管理。在进行周期性任务状态变化检测时,需要取quartz_config内的值来进行判断。这里使用实现SchedulingConfigurer接口来完成动态定时任务
/**
* 执行定时任务.
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Run