最近看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.*;
相关推荐
在标题"Spring4.X+Quartz2.X"中,我们关注的是如何将这两个框架集成到一个项目中,实现基于Spring的定时任务管理。Spring4.X版本引入了一些新特性,比如对Java 8的全面支持、WebSocket支持以及对RESTful服务的改进,...
在Spring3中整合Quartz1.8.6,可以方便地管理并执行定时任务,但随着Spring框架的升级,如升级到Spring4,可能需要与更新版本的Quartz(如2.x)进行集成。 1. **Spring3的IoC容器与Quartz的结合** Spring3的...
基于SpringBoot+ApacheShiro+Quartz+Vue2.x分销商城的微服务分布式框架.zip **技术选型:** - 核心框架:Spring Boot 2.0 - 安全框架:Apache Shiro 1.4 - 视图框架:Jfinal Enjoy - 持久层框架:Jfinal ORM - ...
本项目“Springboot2-Quartz 后台可动态配置的定时任务”是基于SpringBoot 2.x版本与Quartz Scheduler整合的一个示例,它展示了如何在后台管理系统中动态地创建、更新和删除定时任务,以及监控这些任务的状态,为...
Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将深入探讨这两个框架的结合使用以及定时任务的配置。 首先,Spring 框架提供了丰富的功能,如...
Spring Quartz 1.8.x 是一个基于Java的开源任务调度框架,它允许开发者在应用程序中定义定时任务。这个版本是Spring对Quartz Scheduler的一个集成,Quartz是一个强大的、完全可配置的作业调度库,用于执行计划任务。...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Quartz则是一个强大的任务调度库,常用于实现定时任务。本示例"spring3+quartz1.6.4 集群示例"是将两者结合,以实现一个能够支持集群的定时任务管理...
《Spring4与Quartz2整合应用详解》 在企业级应用开发中,任务调度是一项重要的功能,用于执行定时任务,例如数据同步、报表生成等。Spring4和Quartz2是两个常用的开源框架,Spring提供了强大的依赖注入和面向切面...
在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...
在企业级应用开发中,定时任务的管理是一个重要的部分,Quartz是一款强大的开源作业调度框架,常被用于处理定时任务。结合Spring和MyBatis,我们可以构建一个灵活、可扩展的计划任务调度系统。本文将深入探讨如何在...
**Spring2.x集成Quartz调度框架** 在Java应用开发中,常常需要进行任务调度,例如定时执行某些业务逻辑。Quartz是一款强大的、开源的作业调度框架,它支持复杂的调度策略和集群环境。Spring框架则提供了良好的企业...
这个压缩包包含的是SSM框架与Quartz 2.2版本的集成,用于实现定时任务管理。接下来,我们将深入探讨SSM框架的各个组件以及Quartz的相关知识点。 **Spring框架** 是一个全面的、开源的应用程序框架,主要负责依赖...
标题提到“spring+quartz需要的4个jar包”,这意味着我们可以用最少的依赖来集成这两个库。通常,Spring和Quartz的集成会涉及以下关键的jar文件: 1. **Spring框架的核心库**:`spring-context.jar` - 这个jar包含...
主要技术:springMVC springSecurity3.x Mybaits3.x mysql log4j md5 主要功能有: ... springQuartz 定时任务 springAOP日志拦截处理 Mybaits分页插件封装统一处理 总之,是一个非常值得研究的项目
此外,Spring还提供了强大的整合能力,可以与众多开源技术无缝对接,如MyBatis、Hibernate、Quartz定时任务、Apache CXF和 Axis webservices、Spring Boot、Spring Security等,极大地丰富了企业应用的构建选项。...
通过分析和运行这些文件,开发者可以深入理解如何在实际项目中实现SSH2与Quartz的整合,以及如何定义和管理定时任务。这有助于提升对Java Web开发和任务调度的理解,为构建复杂的企业级应用打下坚实基础。
本文将深入探讨如何在Spring 3中整合Quartz 2来实现灵活、可扩展的定时任务系统。 首先,我们要了解Spring 3与Quartz 2的基本概念。Spring 3是Spring框架的一个版本,它提供了诸如依赖注入、面向切面编程、数据访问...
总结一下,Spring 4.x与Quartz 2.x的结合使用,使得在Java应用中实现定时任务变得更加简单和灵活。通过定义Job类,配置JobDetail和Trigger,以及启动Scheduler,我们可以创建并管理一系列自动执行的业务任务。`...
spring-context-support.jar spring整合任务调度quartz必需jar 还需要quartz-all-x.x.x.jar quartz版本必需在1.8.x以下
本教程将围绕"Springboot2+quartz实现定时器的增删改查"这一主题,详细介绍如何在Spring Boot 2.x项目中集成Quartz来实现定时任务,并进行相关的管理操作。 首先,我们需要在Spring Boot项目中引入Quartz的依赖。在...