前言

在实际框架或产品开发过程中,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. bgi::detail::intersection_content用法的测试程序
  2. 【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互
  3. qt-embedded-linux-opensource-src-4.5.3移植到s3c6410
  4. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?
  5. 【iPhone X重磅发布】携A11人工智能芯片登场,人脸识别9大特征
  6. SQL Server大数据表的分区存储
  7. java客户端服务器聊天程序流程图_基于java的socket简单聊天编程
  8. android 状态栏一体化 fragment,单Activity多Fragment动态修改状态栏颜色功能
  9. leetcode136只出现一次的数字
  10. mysql的sql语句where,SQL之WHERE语句
  11. java socket是什么_Java网络编程-JavaSocket编程是什么呢?
  12. 微信小程序 计算导航高度、设置浮层位置
  13. EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List
  14. 二级建造师报考条件不符,选择代报名靠谱吗?
  15. 百度地图、高德地图、腾讯地图比较
  16. Dapper,大规模分布式系统的跟踪系统
  17. 通过本地客户端连接GoogleCloud的Linux虚拟机
  18. 约束多目标优化 约束多目标进化/演化算法入门论文文献推荐 大部分论文代码已开源
  19. 文件传输软件 WinSCP及xftp的使用
  20. DAYU200开箱与基本功能体验

热门文章

  1. Docker制作深度学习镜像常用操作
  2. 5--残差网络(ResNet)
  3. 机器学习基础知识之概率论基础详解
  4. [转]QNX系统开发-镜像制作及烧录分析
  5. 电子版本GB50017-2017钢结构设计标准规范手册共二册含条文说明(共52份,605M)
  6. 软件测试理论知识总结
  7. 最新xcode打包IPA(完整详细图文)
  8. 关于kindle mobi词典解析
  9. mybatis传递pojo类学习
  10. 自动化测试工程师简历模板