最近看quartz定时任务,看到博客园的一篇文章http://www.cnblogs.com/xrab/p/5850186.html(Spring整合Quartz实现动态定时器),他用的是spring3.0.7,quartz是1.8.6,而我用的是spring4.3.2和quartz2.2.1。
我将作者的源码拷贝下来后,发现由于版本问题,很多地方需要调整,不过大部分内容都是基于原作者的代码上进行修改的,还是得感谢这位博主。
下面将修改后的代码贴上,关于一些说明性的东西可去原作者的博客(Spring整合Quartz实现动态定时器)查看。
Maven依赖:
由于spring-webmvc依赖spring的一些基础包,所以这里就不用再引入了。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- Quartz依赖 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
Spring 配置
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
定时器工作类的实现:
package com.axujie.task.jobs; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloWorld implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello World...."); } }
定义定时器管理类:
注意:里面JobDetail和 Trigger的实现,我看官方文档的时候不仔细,漏了几处重要的地方,所以照着官方文档没敲出来
import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import static org.quartz.CronScheduleBuilder.*;
这是导入这几个类的静态方法,之前一直没注意看。。。。
下面是完整的
package com.axujie.task.manager; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import static org.quartz.CronScheduleBuilder.*; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerKey; /** * Quartz调度管理器 * * @author XuJie * @Date 2017年1月21日 */ public class QuartzManager { private static String JOB_GROUP_NAME = "JOB_GROUP_SYSTEM"; private static String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_SYSTEM"; /** * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 * * @param sched * 调度器 * * @param jobName * 任务名 * @param cls * 任务 * @param time * 时间设置,参考quartz说明文档 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, String time) { try { JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);// 任务名,任务组,任务执行类 @SuppressWarnings("unchecked") JobDetail jobDetail = newJob(cls).withIdentity(jobKey).build(); TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器 Trigger trigger = newTrigger().withIdentity(triggerKey) .withSchedule(cronSchedule(time)).build();// 触发器时间设定 sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start();// 启动 } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 添加一个定时任务 * * @param sched * 调度器 * * @param jobName * 任务名 * @param jobGroupName * 任务组名 * @param triggerName * 触发器名 * @param triggerGroupName * 触发器组名 * @param jobClass * 任务 * @param time * 时间设置,参考quartz说明文档 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass, String time) { try { JobKey jobKey = new JobKey(jobName, jobGroupName); @SuppressWarnings("unchecked") JobDetail jobDetail = newJob(jobClass).withIdentity(jobKey).build(); // 触发器 TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); Trigger trigger = newTrigger().withIdentity(triggerKey) .withSchedule(cronSchedule(time)).build(); sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) * * @param sched * 调度器 * @param jobName * @param time * * @Title: QuartzManager.java */ @SuppressWarnings("rawtypes") public static void modifyJobTime(Scheduler sched, String jobName, String time) { try { TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME); JobDetail jobDetail = sched.getJobDetail(jobKey); Class objJobClass = jobDetail.getJobClass(); removeJob(sched, jobName); System.out.println("修改任务:"+jobName); addJob(sched, jobName, objJobClass, time); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一个任务的触发时间 * * @param sched * 调度器 * * @param sched * 调度器 * @param triggerName * @param triggerGroupName * @param time * * @Title: QuartzManager.java */ public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) { try { TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { // 修改时间 trigger.getTriggerBuilder().withSchedule(cronSchedule(time)); // 重启触发器 sched.resumeTrigger(triggerKey); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名) * * @param sched * 调度器 * @param jobName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName) { try { TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME); sched.deleteJob(jobKey);// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一个任务 * * @param sched * 调度器 * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName) { try { TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 JobKey jobKey = new JobKey(jobName, jobGroupName); sched.deleteJob(jobKey);// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:启动所有定时任务 * * @param sched * 调度器 * * @Title: QuartzManager.java */ public static void startJobs(Scheduler sched) { try { sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:关闭所有定时任务 * * @param sched * 调度器 * */ public static void shutdownJobs(Scheduler sched) { try { if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } }
定时器工作类:
该类定义成public,并且实现了Job接口,在execute方法中定义自已的业务实现就可以了
package com.axujie.task.jobs; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloWorld implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello World...."); } }
编写测试类:
此类中使用Class.forName来动态创建任务类,此类也是参照原文写的,原文地址:(Spring整合Quartz实现动态定时器)
import org.junit.Test; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import com.axujie.task.manager.QuartzManager; public class QuartzTest { @Test public void quartz() throws ClassNotFoundException { try { SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); Scheduler sche = gSchedulerFactory.getScheduler(); String job_name = "动态任务调度"; System.out.println("【系统启动】开始(每1秒输出一次)..."); String clazz = "com.axujie.task.jobs.HelloWorld"; String cron = "*/10 * * * * ?"; //使用Class.forName动态的创建 QuartzManager.addJob(sche, job_name, Class.forName(clazz), cron); Thread.sleep(3000); System.out.println("【修改时间】开始(每2秒输出一次)..."); QuartzManager.modifyJobTime(sche, job_name, "10/2 * * * * ?"); Thread.sleep(4000); System.out.println("【移除定时】开始..."); QuartzManager.removeJob(sche, job_name); System.out.println("【移除定时】成功"); System.out.println("【再次添加定时任务】开始(每10秒输出一次)..."); QuartzManager.addJob(sche, job_name, Class.forName(clazz), "*/10 * * * * ?"); Thread.sleep(30000); System.out.println("【移除定时】开始..."); QuartzManager.removeJob(sche, job_name); System.out.println("【移除定时】成功"); } catch (Exception e) { e.printStackTrace(); } } }
最后的输出结果:
【系统启动】开始(每1秒输出一次)... 【修改时间】开始(每2秒输出一次)... 修改任务:动态任务调度 Hello World.... Hello World.... 【移除定时】开始... 【移除定时】成功 【再次添加定时任务】开始(每10秒输出一次)... Hello World....
大部分都是原文作者(Spring整合Quartz实现动态定时器)的东西,只是略做修改,适用于spring4和quartz2罢了。
一定要注意这几个静态方法。。。。
import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import static org.quartz.CronScheduleBuilder.*;
相关推荐
基于SpringBoot+ApacheShiro+Quartz+Vue2.x分销商城的微服务分布式框架.zip **技术选型:** - 核心框架:Spring Boot 2.0 - 安全框架:Apache Shiro 1.4 - 视图框架:Jfinal Enjoy - 持久层框架:Jfinal ORM - ...
主要技术:springMVC springSecurity3.x Mybaits3.x mysql log4j md5 主要功能有: ... springQuartz 定时任务 springAOP日志拦截处理 Mybaits分页插件封装统一处理 总之,是一个非常值得研究的项目
spring-context-support.jar spring整合任务调度quartz必需jar 还需要quartz-all-x.x.x.jar quartz版本必需在1.8.x以下
- 引入quartz定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能 - 引入Hibernate Validator校验框架,轻松实现后端校验 - 引入云存储服务,已支持:七牛云、阿里云、腾讯云等 - 引入swagger...
Spring3.x企业应用开发实战 中 Spring 定时任务源码(spring 三种定时任务的实现方式),Spring quartz java 定时器 定时任务 源码
定时任务 与Spring整合必须使用Quartz1.8.x及以下版本 否则报错 java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as ...
茴香豆的“茴”有几种写法? spring 整合 quartz|| timer有几种方式? ...代码示例,依赖spring2.x.jar quartz1.6.x.jar 相关介绍: http://blog.csdn.net/liu251/archive/2009/08/18/4459514.aspx
基于 Spring Boot 2.X 版本的深度入门教程。 市面上的 Spring Boot 基础入门文章很多,但是深度入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章...
一个涵盖六个专栏:Spring Boot 2.X、Spring Cloud、Spring Cloud Alibaba、Dubbo、分布式消息队列、分布式事务的仓库。基于 Spring Boot 2.X 版本的深度入门教程。快速学会 SpringMVC API 接口的编写的同时,我还想...
13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password标签 13.9.7. select标签 13.9.8. option标签 13.9.9. options标签 13.9.10. textarea标签 13.9.11. hidden标签...
Java社区系统源码并提供详细的开发文档和配套教程,包含帖子、评论、私信、系统通知、...分布式定时任务:Spring Quartz 日志:SLF4J(日志接口) + Logback(日志实现) 前端: Thymeleaf Bootstrap 4.x Jquery Ajax
13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 14.1. 简介 14.2. JSP和JSTL 14.2.1. 视图解析器 14.2.2. 'Plain-...
13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password标签 13.9.7. select标签 13.9.8. option标签 13.9.9. options标签 13.9.10. textarea标签 13.9.11. ...
里面有两个定时任务, 一个是使用普通JAVA类,通过Spring使用MethodInvokingJobDetailFactoryBean注入,形式调用; 另一个是Spring使用JobDetailBean类,继承QuartzJobBean,重写 protected void executeInternal...
13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. checkboxes标签 13.9.6. radiobutton标签 13.9.7. radiobuttons标签 13.9.8. password标签 13.9.9. select标签 13.9.10. option标签 ...
11.7.2. 处理BLOB 和 CLOB对象 11.7.3. 在IN语句中传入一组参数值 11.7.4. 处理复杂类型的存储过程调用 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring容器中...
job(`分布式定时任务`)、swagger(`API接口管理测试`)、security(`基于RBAC的动态权限认证`)、SpringSession(`Session共享`)、Zookeeper(`结合AOP实现分布式锁`)、RabbitMQ(`消息队列`)、Kafka(`消息队列`)、...
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。...5.定时任务:Quartz。 6.数据库连接池:Druid。 7.工具类:Fastjson。 8.前端:Thymeleaf+html+JQuery+bootstrap
Quartz定时任务:异常报警 多样验证码:图片验证码、腾讯滑块验证码,配置快速切换 日志管理:登录日志、操作日志 系统监控:资源监控、redis监控 接口限制:停用、限流 通知公告:富文本编辑器 功能测试:测试邮件...
自做OA管理项目是一个由MyEclipse创建,Struts2.3.x+Spring3.2.x+Hibernate3.x+...Quartz定时任务的实现。 配置项目注意: 配置数据库修改\config目录下的jdbc.properties即可。 配置FTP服务器需修改,applicationCon