动态配置定时任务(Spring Boot + quartz 的整合)
在整个项目规划中,有的时候需要定时的去执行某一段代码,触发时间能随时修改,并且不影响项目的整体运行。所以,定时器的设计就必须要灵活,能随时的增,删,改定时任务。
数据库设计
CREATE TABLE `sys_task` (`id` int(11) NOT NULL AUTO_INCREMENT,`created_at` datetime NOT NULL COMMENT '创建时间',`updated_at` datetime NOT NULL COMMENT '修改时间',`task_name` varchar(255) DEFAULT NULL COMMENT '任务名称',`task_remark` varchar(255) DEFAULT NULL COMMENT '说明',`job_class` varchar(255) NOT NULL COMMENT '任务类',`cron_expression` varchar(255) NOT NULL COMMENT '规则表达式',`is_enable` smallint(1) NOT NULL COMMENT '是否启用',`status` varchar(25) DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COMMENT='系统任务调度';
maven 依赖
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.3.7.RELEASE</version>
</dependency>
调度器类
import java.util.Date;import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;/*** 任务调度**/
@Configuration
public class QuartzScheduler {@Autowiredprivate Scheduler scheduler;/*** 获取Job信息* * @param name 类名* @return* @throws SchedulerException*/public String getJobInfo(String name) throws SchedulerException {TriggerKey triggerKey = new TriggerKey(name, scheduler.DEFAULT_GROUP);CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),scheduler.getTriggerState(triggerKey).name());}/*** 修改某个任务的执行时间* * @param name 类名* @param time 任务触发时间* @return* @throws SchedulerException*/public boolean modifyJob(String name, String time) throws SchedulerException {Date date = null;TriggerKey triggerKey = new TriggerKey(name, scheduler.DEFAULT_GROUP);CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);String oldTime = cronTrigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();date = scheduler.rescheduleJob(triggerKey, trigger);}return date != null;}/*** 暂停所有任务* * @throws SchedulerException*/public void pauseAllJob() throws SchedulerException {scheduler.pauseAll();}/*** 暂停某个任务* * @param name 类名*/public void pauseJob(String name) throws SchedulerException {JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);JobDetail jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null)return;scheduler.pauseJob(jobKey);}/*** 恢复所有任务* * @throws SchedulerException*/public void resumeAllJob() throws SchedulerException {scheduler.resumeAll();}/*** 恢复某个任务* * @param name 类名*/public void resumeJob(String name) throws SchedulerException {JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);JobDetail jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null)return;scheduler.resumeJob(jobKey);}/*** 删除某个任务* * @param name 类名*/public void deleteJob(String name) throws SchedulerException {JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);JobDetail jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null)return;scheduler.deleteJob(jobKey);}/*** 添加定时器* * @param name 类名* @param time 任务触发时间* @throws SchedulerException*/public void addJob(String name,String time) throws SchedulerException {Class classs = null;try {classs = Class.forName(name);} catch (ClassNotFoundException e1) {e1.printStackTrace();}JobDetail jobDetail = JobBuilder.newJob(classs).withIdentity(name, scheduler.DEFAULT_GROUP).build();CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();scheduler.scheduleJob(jobDetail, cronTrigger);}
}
初始化任务
import java.util.List;import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;/*** 任务初始化调度**/
@Configuration
public class ApplicationStartQuartzJob implements ApplicationListener<ContextRefreshedEvent> {@Autowiredprivate SysTaskService sysTaskService;@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {Example example=new Example(SysTask.class);Criteria createCriteria = example.createCriteria();createCriteria.andEqualTo("isEnable", 1);List<SysTask> sysTaskList = sysTaskService.selectByExample(example);Scheduler scheduler=null;try {scheduler = scheduler();} catch (SchedulerException e) {e.printStackTrace();}if(!sysTaskList.isEmpty()){for (SysTask sysTask : sysTaskList) {Class classs=null;try {classs = Class.forName(sysTask.getJobClass());} catch (ClassNotFoundException e) {e.printStackTrace();}JobDetail jobDetail = JobBuilder.newJob(classs).withIdentity(sysTask.getJobClass(), scheduler.DEFAULT_GROUP).build();CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysTask.getCronExpression());CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(sysTask.getJobClass(), scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();try {scheduler.scheduleJob(jobDetail, cronTrigger);} catch (SchedulerException e) {e.printStackTrace();}}}try {scheduler.start();} catch (SchedulerException e) {e.printStackTrace();}}/*** 初始注入scheduler* @return* @throws SchedulerException*/@Beanpublic Scheduler scheduler() throws SchedulerException{SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();return schedulerFactoryBean.getScheduler(); }}
编写测试类
public class Test1 implements Job {@Overridepublic void execute(JobExecutionContext context)throws JobExecutionException {//任务执行逻辑代码片段}}
Spring Boot 与 quartz 的整合已经完成了,可以通过配置表 sys_task 表中的数据数来灵活的配置定时任务了。
作者:万木林
链接:
https://blog.csdn.net/qq_37465151/article/details/82906654
动态配置定时任务(Spring Boot + quartz 的整合)相关推荐
- Spring Boot 2.x整合Quartz
宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...
- java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务
基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及 ...
- [Spring Boot]Druid datasource整合及配置
[Spring Boot]Druid datasource整合及配置 创建Spring Boot项目 这里使用默认配置创建一个空项目 demo-druid 用作演示,可跳过这一段: 只勾选基本的Spr ...
- Spring与Quartz的整合实现定时任务调度
Spring与Quartz的整合实现定时任务调度 摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然 ...
- spring boot使用Jedis整合Redis
文章目录 spring boot使用jedis整合redis 总结 Spring Boot整合Redis有两种方式,分别是Jedis和RedisTemplate,那么它们二者有什么区别呢? 1.Jed ...
- java application.xml_第4章 零XML配置的Spring Boot Application
第4章 零XML配置的Spring Boot Application Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件.YAML 文件.环境变 ...
- springboot整合Quartz实现动态配置定时任务
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/60873295 前言 在我们日常的开发中,很多 ...
- spring boot elastic job 整合-定时任务
一.采用当当网elastic job,实现spingboot启动注入定时任务,任务配置在数据库,可以动态加载任务配置. 上干货 引入jar <properties><elastic- ...
- 使用Spring Boot + Quartz 实现分布式定时任务平台
本文将从项目实战出发来介绍分布式定时任务的实现.在某些应用场景下要求任务必须具备高可用性和可扩展性,单台服务器不能满足业务需求,这时就需要使用Quartz实现分布式定时任务. 一.分布式任务应用场景 ...
最新文章
- plist 文件的读写
- 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑
- gradle 替换java类_Gradle字符串替换
- Android系统签名文件
- 标注工具 labelImg 的下载安装及使用
- Redis 实战场景
- 数字信号处理(三)离散时间信号的Z变换
- js大地坐标与经纬度坐标互转
- UI自动化测试神器->Cypress
- CISCO 思科2960G CONSOLE口越过登陆账号密码访问
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
- nlp文本预处理构建词汇表
- 编包----rpm和deb和ISO目录制作出ISO
- (改进GM(1,1)模型)灰色残差马尔科夫预测模型的matlab实现
- 达梦数据库,删除表重复数据
- office2016下安装Mathtype之后显示DLL找不到的问题
- 数学菜鸟的AI学习攻略 | 数学符号轻松入门
- 弘辽科技:新世相与淘宝直播合作,直播生态困局将有新突破?
- C语言书写推箱子(坤坤版easyx库)
- 超详细域名备案+阿里云服务器配置+小程序开发(简略)+前后端分离(简略)