前言

在实际框架或产品开发过程中,springboot中集成quarzt方式基本是以job和trigger的bean对象方式直接硬编码完成的,例如以下代码示例。对于系统内定义的所有定时任务类型,具体执行类,执行策略,运行状态都没有一个动态全局的管理,所有决定将quartz做成可视化配置管理,便于统一管理,也降低了使用门槛,只需要关心job类的实现即可

    @Beanpublic JobDetail SMSJobDetail() {return JobBuilder.newJob(SMSJob.class).withIdentity("SMSJob").storeDurably().build();}// 把jobDetail注册到trigger上去@Beanpublic Trigger myJobTrigger() {SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever();return TriggerBuilder.newTrigger().forJob(SMSJobDetail()).withIdentity("myJobTrigger").withSchedule(scheduleBuilder).build();}

表结构

用于存储quartz配置

DROP TABLE IF EXISTS `f_quartztask`;
CREATE TABLE `f_quartztask` (`TaskID` varchar(50) NOT NULL,`TaskName` varchar(200) DEFAULT NULL,`TaskType` int(11) DEFAULT NULL,`TaskTag` varchar(100) DEFAULT NULL,`JobClassPath` varchar(200) DEFAULT NULL,`ExecutePeroid` int(11) DEFAULT NULL,`ExecuteUnit` int(11) DEFAULT NULL,`CornExpress` varchar(200) DEFAULT NULL,`Enviroment` varchar(50) DEFAULT NULL,`TaskStatus` int(11) DEFAULT NULL,`SortNum` int(11) DEFAULT NULL,`Remark` varchar(500) DEFAULT NULL,PRIMARY KEY (`TaskID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

枚举类

public class QuartzEnum {public enum TaskType implements IConvertEnumToCodeItem {Cycle(10, "循环任务"), Corn(20, "Corn表达式任务");private int _value;private String _name;private TaskType(int value, String name) {set_value(value);set_name((name));}public int get_value() {return _value;}public void set_value(int _value) {this._value = _value;}public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}@Overridepublic String toString() {return _name;}@Overridepublic String getCodeName() {return "Quartz任务类别";}}public enum ExecuteUnit implements IConvertEnumToCodeItem {Second(10, "秒"), Minute(20, "分"), Hour(30, "时");private int _value;private String _name;private ExecuteUnit(int value, String name) {set_value(value);set_name((name));}public int get_value() {return _value;}public void set_value(int _value) {this._value = _value;}public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}@Overridepublic String toString() {return _name;}@Overridepublic String getCodeName() {return "Quartz间隔单位";}}public enum TaskStatus implements IConvertEnumToCodeItem {Open(10, "开启"), Close(20, "关闭");private int _value;private String _name;private TaskStatus(int value, String name) {set_value(value);set_name((name));}public int get_value() {return _value;}public void set_value(int _value) {this._value = _value;}public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}@Overridepublic String toString() {return _name;}@Overridepublic String getCodeName() {return "Quartz任务状态";}}public enum TaskEnviroment implements IConvertEnumToCodeItem {All("全部", "全部"), Dev("dev", "开发环境"), Pro("pro", "正式环境");private String _value;private String _name;private TaskEnviroment(String value, String name) {set_value(value);set_name((name));}public String get_value() {return _value;}public void set_value(String _value) {this._value = _value;}public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}@Overridepublic String toString() {return _name;}@Overridepublic String getCodeName() {return "Quartz任务执行环境";}}
}

QuartzFactory

支持Job类注bean入对象

@Component
public class QuartzFactory extends AdaptableJobFactory {@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {// 调用父类的方法Object jobInstance = super.createJobInstance(bundle);// 进行注入capableBeanFactory.autowireBean(jobInstance);return jobInstance;}
}

QuartzConfig

注入QuartzFactory对象

@Configuration
public class QuartzConfig {@Autowiredprivate QuartzFactory quartzFactory;@Beanpublic SchedulerFactoryBean schedulerFactoryBean(){SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();schedulerFactoryBean.setJobFactory(quartzFactory);//将job实例化,能够操作进行Spring 注入return schedulerFactoryBean;}
}

QuartzUtil

定时任务动态添加/删除操作类,initQuartzTask方法在系统启动时执行,根据配置自动开启相关符合条件的任务

@Component
public class QuartzUtil {@Autowiredprivate SchedulerFactoryBean schedulerFactoryBean;@Autowiredprivate F_QuartzTaskService quartzTaskService;@Value("${spring.profiles.active}")private String active;private static String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP_NAME";private static String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP_NAME";public void initQuartzTask() {List<F_QuartzTaskDO> openTaskList = quartzTaskService.selectAllList();if(openTaskList.size()>0){openTaskList = openTaskList.stream().filter(a -> a.getTaskStatus() == QuartzEnum.TaskStatus.Open.get_value() &&(a.getEnviroment().equals(QuartzEnum.TaskEnviroment.All.get_name()) || a.getEnviroment().equals(active))).collect(Collectors.toList());}for (F_QuartzTaskDO taskDO : openTaskList) {try {Class<Job> jobClass = (Class<Job>) Class.forName(taskDO.getJobClassPath());if (taskDO.getTaskType() == QuartzEnum.TaskType.Cycle.get_value()) {addIntervalJob(taskDO.getTaskTag(), jobClass, taskDO.getExecutePeroid(), taskDO.getExecuteUnit());} else {addCornJob(taskDO.getTaskTag(), jobClass, taskDO.getCornExpress());}} catch (Exception e) {e.printStackTrace();}}if (openTaskList.size() > 0) {System.out.println("扫描并初始化开启quartz定时任务成功,任务数量:" + openTaskList.size() + "个");}}public void startTask( F_QuartzTaskDO taskDO){try {Class<Job> jobClass = (Class<Job>) Class.forName(taskDO.getJobClassPath());if (taskDO.getTaskType() == QuartzEnum.TaskType.Cycle.get_value()) {addIntervalJob(taskDO.getTaskTag(), jobClass, taskDO.getExecutePeroid(), taskDO.getExecuteUnit());} else {addCornJob(taskDO.getTaskTag(), jobClass, taskDO.getCornExpress());}} catch (Exception e) {e.printStackTrace();}}//增加定时任务任务public void addIntervalJob(String jobName, Class<? extends Job> cls, int peroid, int timeUnit) {try {SimpleScheduleBuilder scheduleBuilder = null;if (timeUnit == QuartzEnum.ExecuteUnit.Second.get_value()) {scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(peroid).repeatForever();} else if (timeUnit == QuartzEnum.ExecuteUnit.Minute.get_value()) {scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(peroid).repeatForever();} else if (timeUnit == QuartzEnum.ExecuteUnit.Hour.get_value()) {scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(peroid).repeatForever();}Scheduler sched = schedulerFactoryBean.getScheduler();JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).storeDurably().build();Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).withIdentity(jobName, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();sched.scheduleJob(jobDetail, trigger);if (!sched.isShutdown()) {sched.start();        // 启动}} catch (Exception e) {throw new RuntimeException(e);}}//增加corn表达式任务public void addCornJob(String jobName, Class<? extends Job> cls, String cornExpress) {try {Scheduler sched = schedulerFactoryBean.getScheduler();JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build();CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME).withSchedule(CronScheduleBuilder.cronSchedule(cornExpress)).build();sched.scheduleJob(jobDetail, trigger);if (!sched.isShutdown()) {sched.start();        // 启动}} catch (Exception e) {throw new RuntimeException(e);}}//停止任务public void deleteJob(String jobName) {try {Scheduler sched = schedulerFactoryBean.getScheduler();TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);sched.pauseTrigger(triggerKey); // 停止触发器sched.unscheduleJob(triggerKey);// 移除触发器sched.deleteJob(jobKey);        // 删除任务} catch (Exception e) {throw new RuntimeException(e);}}}

界面展示

SpringBoot实现quartz定时任务可视化管理相关推荐

  1. Springboot集成quartz定时任务可视化配置​​​​​​​

    转自我的个人博客:Springboot集成quartz定时任务可视化配置 使用quartz定时任务已经有一段时间了,今天记录一下Springboot 2.x集成Quartz. 1.引入quartz j ...

  2. Springboot 使用quartz 定时任务 增删改查

    前段时间公司项目用到了 定时任务 所以写了一篇定时任务的文章 ,浏览量还不错 , Springboot 整合定时任务 ) 所以就准备写第二篇, 如果你是一名Java工程师,你也可以会看到如下的页面 , ...

  3. Springboot集成Quartz定时任务yml文件配置方式

    构建maven项目,引入maven依赖包 其中quartz.quartz-jobs.spring-boot-starter-quartz.spring-context-support  四个依赖包为q ...

  4. springboot、quartz定时任务未触发

    spring boot.quartz定时任务不触发 定时每隔5分钟触发一次 但是定时任务没有触发,不知道为什么? 若您知道原因,请留言谢谢 解决办法 针对多模块,若要一个web模块启动定时器模块,那么 ...

  5. SpringBoot结合Quartz实现定时任务

    <从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...

  6. quartz 动态添加job_SpringBoot+Quartz实现动态管理定时任务

    前言: 最近在做Java开发对接微信公众平台之类的工作,在开发过程中遇到一个需求是定时任务这块的,但是普通的定时任务还远远不能满足:最后要实现的效果是每个任务都是不同的定时时间来执行而且是在前台页面上 ...

  7. springboot和quartz整合实现动态定时任务(持久化单节点)

    Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...

  8. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  9. SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  10. SpringBoot整合Quartz执行持久化定时任务

    使用: 个人博客项目,定时刷新帖子排名用到了定时任务,在这里记录下来SpringBoot整合Quartz的基本使用,记录的同时也希望能帮助到大家. 1.什么是Quartz 官方介绍: Quartz是一 ...

最新文章

  1. Eclipse 每行 79 字符限制的提示线
  2. 什么是Activity、生命周期
  3. mysql主从同步简单原理_MYSQL简单主从复制原理及实现
  4. .Net Core 部署到Ubuntu 16.04 中的步骤
  5. 当执行打印预览window.close无效
  6. 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
  7. Oracle 应用归档 卡死,关于Oracle归档进程的运行机制
  8. java程序流程控制_java程序流程控制
  9. oracle 39170,39170-1134
  10. Spring Data JPA教程,第一部分: Configuration(翻译)
  11. hudi延迟日志命名
  12. 浏览器对象模型bom的作用是什么?
  13. JAVA接口和抽象类的特点
  14. 【5G架构】5G 协议栈结构以及与OSI七层协议之间的关系
  15. Point to Raster 工作原理
  16. MAC PHP集成环境安装MAMP
  17. 十年程序人生__转自黎活明
  18. JAVA怎么打开pkg_PKG文件在电脑上怎么打开!(普通PC)
  19. WEB-漏洞总结(sql注入详解)
  20. Q1财报蛋壳公寓再亏损:盈利死穴如何破?

热门文章

  1. 简述JVM垃圾回收机制
  2. RFC8998+BabaSSL---让国密驶向更远的星辰大海
  3. 机器学习十大算法实现代码汇总(python)----线性回归、逻辑回归、决策树、支持向量机、朴素贝叶斯、K邻近算法、K-均值算法、随机森林、降低维度算法、梯度增强算法
  4. 获取火山无水印视频方法
  5. 支付宝微信QQ钱包收款码合并教程及源码下载
  6. 持久化内存+傲腾持久化内存
  7. Android NDK开发,使用ndk-build编译,写的太详细了
  8. 微信模拟地理位置_微信电脑版伪装地理位置的方法
  9. 使用usb to ttl串口下载器破解移动电视盒子(CM201-2)
  10. 微信小程序直播是怎么做的