![1a65d0a3d55897a025ec9f39a92be579.png](https://i-blog.csdnimg.cn/blog_migrate/6d379f8ee1e7918d62f22b51b7e772b6.jpeg)
什么是动态配置定时任务?
首先说下这次主题,动态配置。没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式
定时任务实现方式千人千种,不过基础的无外乎 1、JDK 的Timer类 2、Quartz 3、SpringTask 。生产上三种方式我都有使用过。但是使用过程中用的最多的便是xml配置的方式,这种方式最简单,无代码侵入,也比较好理解。
但是却有个致命的缺点,比如你要改某个任务的触发时间,亦或是你要新增一个任务,暂停一个任务。怎么做?
停应用!改XML配置!重新启动!
是不是很致命。最近重新研究了下Quartz的配置,实现了不停机添加、暂停、删除、立即触发任务的方法,在本篇分享出来,其实也不算是完全的研究,在上家公司已经有大佬实现了,这次是也是基于大佬的理解重新实现下。
管理界面:
![56e40c73078f507e41930ca196662aa9.png](https://i-blog.csdnimg.cn/blog_migrate/cb37275c7dac900515d1e76c75b34937.png)
效果图:实在不知道该跑什么了,每隔十秒打一段话吧
![76055169463e2884c35e1c6af0cd5d1f.png](https://i-blog.csdnimg.cn/blog_migrate/67d25ce2776912d4854a04a65c8352da.jpeg)
技术实现
maven依赖
使用springboot做框架支持
<!--
数据表
CREATE
实现步骤
① 启动项目,启动task监听
② 读取数据库,将开启的任务job和trigger加载到scheduler调度器
③ 根据任务调度运行job类
④ 每次运行利用AdaptableJobFactory实例化job类,以便注入要运行的service
听着是不是很简单,但却还是一头雾水,且听我慢慢道来~~
代码逻辑
第一步:启动项目,加载监听
Quartz配置
Springboot的配置方法,常规Spring项目可以在xml中配置
@Configuration
监听器
@Component
CommandLineRunner类似Spring框架的ApplicationListener监听器。官方的解释是:
Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or Order @Order annotation.
接口被用作将其加入spring容器中时执行其run方法。多个CommandLineRunner可以被同时执行在同一个spring上下文中并且执行顺序是以order注解的参数顺序一致。
第二步:读取数据库,加载scheduler调度器
job方法
@Override
添加任务到Quartz调度器
/**
Scheduler作为Quartz的核心调度器,有将近50多个API接口,包括任务的添加,暂停,恢复,删除等一系列的API,这里仅介绍一些常用的,想要了解更多可以稍后看下彩蛋部分。
1、start()方法:只有调用start()方法后,Scheduler线程才开始启动触发器trigger,运行job
2、pauseJob(JobKey jobKey) :根据指定的JobDetail key暂停job。
3、resumeJob(JobKey jobKey) :根据指定的key恢复一个job。
4、deleteJob(JobKey jobKey) :删除一个job
5、triggerJob(JobKey jobKey) :触发一个JobDetail(现在执行)。
6、rescheduleJob(TriggerKey triggerKey, Trigger newTrigger):
用给定的键删除触发器,并存储新的触发器,它必须与同一个作业相关联(新触发器必须具有指定的作业名和组)-然而,新触发器不必具有与旧触发器相同的名称。
第三步:根据任务调度运行job类
其实这一步是不需要我们编写的,在我们将正确的JobDetail 和 Trigger 表达式加载到任务调度后,调度器会自动触发任务的执行
第四步:实例化job类,注入要运行的service
工厂类
@Component
任务类
@DisallowConcurrentExecution
好了,大功告成,一个简单的动态配置的定时任务已经完成。是不是so easy,下面我们再来简单实现下其他的几种常用的api吧。
暂停一个job
public
恢复一个job
public
删除一个job
public
立即触发job
public
更新job表达式
public
好了,正文部分基本上就这些,不多废话了,本文没有太多的讲解原理,只是简单的应用,水平不够还望大家见谅。
看了上面的效果图是不是还是有种看的见摸不着的感觉,老爷爷这里也做了个线上的实例供大家体验~有兴趣的同学可以亲自试验一下。
实例地址:http://www.laoyeye.net/management/index 账号/密码:test/123456 菜单:系统设置/计划任务
当然了还有最重要的源码和API文档我也不会忘的。
源码地址:https://github.com/allanzhuo/yyblog
Quartz文档地址:https://github.com/allanzhuo/yyblog/tree/master/doc
最后的最后,看都看了,码字不易,顺手点个赞白~^_^
原作者:小卖铺的老爷爷
原文链接:Quartz实现JAVA定时任务的动态配置 - 小卖铺的老爷爷 - 博客园
原出处:博客园
侵删
![3ca85a87c779555fe16dc06413395385.gif](https://i-blog.csdnimg.cn/blog_migrate/95d036d61604e6cea86c3a7f2f7ccac6.gif)