在整个项目规划中,有的时候需要定时的去执行某一段代码,触发时间能随时修改,并且不影响项目的整体运行。所以,定时器的设计就必须要灵活,能随时的增,删,改定时任务。

数据库设计

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 的整合)相关推荐

  1. Spring Boot 2.x整合Quartz

    宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...

  2. java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

    基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及 ...

  3. [Spring Boot]Druid datasource整合及配置

    [Spring Boot]Druid datasource整合及配置 创建Spring Boot项目 这里使用默认配置创建一个空项目 demo-druid 用作演示,可跳过这一段: 只勾选基本的Spr ...

  4. Spring与Quartz的整合实现定时任务调度

    Spring与Quartz的整合实现定时任务调度 摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然 ...

  5. spring boot使用Jedis整合Redis

    文章目录 spring boot使用jedis整合redis 总结 Spring Boot整合Redis有两种方式,分别是Jedis和RedisTemplate,那么它们二者有什么区别呢? 1.Jed ...

  6. java application.xml_第4章 零XML配置的Spring Boot Application

    第4章 零XML配置的Spring Boot Application Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件.YAML 文件.环境变 ...

  7. springboot整合Quartz实现动态配置定时任务

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/60873295 前言 在我们日常的开发中,很多 ...

  8. spring boot elastic job 整合-定时任务

    一.采用当当网elastic job,实现spingboot启动注入定时任务,任务配置在数据库,可以动态加载任务配置. 上干货 引入jar <properties><elastic- ...

  9. 使用Spring Boot + Quartz 实现分布式定时任务平台

    本文将从项目实战出发来介绍分布式定时任务的实现.在某些应用场景下要求任务必须具备高可用性和可扩展性,单台服务器不能满足业务需求,这时就需要使用Quartz实现分布式定时任务. 一.分布式任务应用场景 ...

最新文章

  1. plist 文件的读写
  2. 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑
  3. gradle 替换java类_Gradle字符串替换
  4. Android系统签名文件
  5. 标注工具 labelImg 的下载安装及使用
  6. Redis 实战场景
  7. 数字信号处理(三)离散时间信号的Z变换
  8. js大地坐标与经纬度坐标互转
  9. UI自动化测试神器->Cypress
  10. CISCO 思科2960G CONSOLE口越过登陆账号密码访问
  11. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
  12. nlp文本预处理构建词汇表
  13. 编包----rpm和deb和ISO目录制作出ISO
  14. (改进GM(1,1)模型)灰色残差马尔科夫预测模型的matlab实现
  15. 达梦数据库,删除表重复数据
  16. office2016下安装Mathtype之后显示DLL找不到的问题
  17. 数学菜鸟的AI学习攻略 | 数学符号轻松入门
  18. 弘辽科技:新世相与淘宝直播合作,直播生态困局将有新突破?
  19. C语言书写推箱子(坤坤版easyx库)
  20. 超详细域名备案+阿里云服务器配置+小程序开发(简略)+前后端分离(简略)

热门文章

  1. 可疑交易_IE的可疑版本定位
  2. 《SRE:Google运维解密》
  3. P5.js开发之——通过createImg向页面中添加图像
  4. 全维观测器matlab,全维状态观测器详解.ppt
  5. HBase集成Hive详解
  6. css 空格数字 宽度,CSS代码书写规范究极指南
  7. 代号SSR如何在电脑上玩 代号SSR手游模拟器教程
  8. 【Oracle】oracle数据库初始化
  9. python 灰度直方图_数字图像处理灰度变换之灰度直方图及python实现
  10. 平价降噪耳机哪个牌子好?便宜又好用的降噪耳机推荐