`
xj黑面书生
  • 浏览: 5229 次
社区版块
存档分类
最新评论

spring4+quartz2.x 动态定时任务

阅读更多

 

         最近看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

    基于SpringBoot+ApacheShiro+Quartz+Vue2.x分销商城的微服务分布式框架.zip **技术选型:** - 核心框架:Spring Boot 2.0 - 安全框架:Apache Shiro 1.4 - 视图框架:Jfinal Enjoy - 持久层框架:Jfinal ORM - ...

    springMVC+springSecurity3.x+Mybaits3.x的权限系统

    主要技术:springMVC springSecurity3.x Mybaits3.x mysql log4j md5 主要功能有: ... springQuartz 定时任务  springAOP日志拦截处理   Mybaits分页插件封装统一处理 总之,是一个非常值得研究的项目

    spring-context-support.jar

    spring-context-support.jar spring整合任务调度quartz必需jar 还需要quartz-all-x.x.x.jar quartz版本必需在1.8.x以下

    基于SpringBoot+Vue开发的前后端分离外卖点单系统源码+数据库+项目说明.zip

    - 引入quartz定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能 - 引入Hibernate Validator校验框架,轻松实现后端校验 - 引入云存储服务,已支持:七牛云、阿里云、腾讯云等 - 引入swagger...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    Spring3.x企业应用开发实战 中 Spring 定时任务源码(spring 三种定时任务的实现方式),Spring quartz java 定时器 定时任务 源码

    quartz-all-1.6.6.jar

    定时任务 与Spring整合必须使用Quartz1.8.x及以下版本 否则报错 java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as ...

    spring 整合 quartz|| timer

    茴香豆的“茴”有几种写法? 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 Cloud、Spring Cloud Alibaba、Dubbo、分布式.zip

    基于 Spring Boot 2.X 版本的深度入门教程。 市面上的 Spring Boot 基础入门文章很多,但是深度入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章...

    基于 Spring Boot 2.X 版本的深度入门教程

    一个涵盖六个专栏:Spring Boot 2.X、Spring Cloud、Spring Cloud Alibaba、Dubbo、分布式消息队列、分布式事务的仓库。基于 Spring Boot 2.X 版本的深度入门教程。快速学会 SpringMVC API 接口的编写的同时,我还想...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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标签...

    社区系统源码:基于 SpringBoot + MyBatis + MySQL + Redis + Kafka

    Java社区系统源码并提供详细的开发文档和配套教程,包含帖子、评论、私信、系统通知、...分布式定时任务:Spring Quartz 日志:SLF4J(日志接口) + Logback(日志实现) 前端: Thymeleaf Bootstrap 4.x Jquery Ajax

    spring chm文档

    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-...

    Spring 2.0 开发参考手册

    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. ...

    Spring3x集成Quartz2x示例工程 两种引入方式

    里面有两个定时任务, 一个是使用普通JAVA类,通过Spring使用MethodInvokingJobDetailFactoryBean注入,形式调用; 另一个是Spring使用JobDetailBean类,继承QuartzJobBean,重写 protected void executeInternal...

    Spring中文帮助文档

    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标签 ...

    Spring API

    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容器中...

    spring boot集成demo大全.zip

    job(`分布式定时任务`)、swagger(`API接口管理测试`)、security(`基于RBAC的动态权限认证`)、SpringSession(`Session共享`)、Zookeeper(`结合AOP实现分布式锁`)、RabbitMQ(`消息队列`)、Kafka(`消息队列`)、...

    计算机毕业设计:基于springboot、vue大学生实习管理系统设计与实现.zip

    1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。...5.定时任务:Quartz。 6.数据库连接池:Druid。 7.工具类:Fastjson。 8.前端:Thymeleaf+html+JQuery+bootstrap

    基于SpringBoot3.x+Mybatis-Plus开发的通用后台管理系统源代码+数据库,简单易用,快速上手

    Quartz定时任务:异常报警 多样验证码:图片验证码、腾讯滑块验证码,配置快速切换 日志管理:登录日志、操作日志 系统监控:资源监控、redis监控 接口限制:停用、限流 通知公告:富文本编辑器 功能测试:测试邮件...

    JokerOne:自做OA管理项目

    自做OA管理项目是一个由MyEclipse创建,Struts2.3.x+Spring3.2.x+Hibernate3.x+...Quartz定时任务的实现。 配置项目注意: 配置数据库修改\config目录下的jdbc.properties即可。 配置FTP服务器需修改,applicationCon

Global site tag (gtag.js) - Google Analytics