spring4+quartz2.x 动态定时任务

标签: spring4 quartz2 任务 | 发表时间:2017-01-22 00:40 | 作者:xj黑面书生
出处:http://www.iteye.com

 

         最近看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.*;

 

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring4 quartz2 任务] 推荐:

spring4+quartz2.x 动态定时任务

- - Java - 编程语言 - ITeye博客
         最近看quartz定时任务,看到博客园的一篇文章http://www.cnblogs.com/xrab/p/5850186.html( Spring整合Quartz实现动态定时器),他用的是spring3.0.7,quartz是1.8.6,而我用的是spring4.3.2和quartz2.2.1.

【转】Spring4+Hibernate4+JBPM6

- - 研发管理 - ITeye博客
Eclipse的link方式安装JBPM6插件 http://blog.csdn.net/dcz1001/article/details/19905035. 安装JBPM6运行环境(JBPM6学习之二). 创建第一个JBPM6项目并且运行自带的helloword例子(JBPM6学习之三). Spring JBPM6整理例子代码: https://github.com/kylinsoong/jbpm-6-examples/tree/master/spring-integration.

Spring4新特性——Web开发的增强

- - ITeye博客
Spring4新特性——泛型限定式依赖注入. Spring4新特性——核心容器的其他改进. Spring4新特性——Web开发的增强. 从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的).

Spring4新特性——核心容器的其他改进

- - ITeye博客
接上一篇《 Spring4新特性——泛型限定式依赖注入》,接下来我们看看Spring4的其他改进. 这样会注入:key是bean名字;value就是所有实现了BaseService的Bean,假设使用上一篇的例子,则会得到:.  这样会注入所有实现了BaseService的Bean;但是顺序是不确定的,如果我们想要按照某个顺序获取;在Spring4中可以使用@Order或实现Ordered接口来实现,如:.

任务完成

- pp2moonbird - YesKafei Daily
这段令人激动又伤感的视频,集合了航天飞机的自始至终. 你可以一览航天飞机执行的所有任务,人类探索太空的渴望和梦想,但也看到了挑战者号和哥伦比亚号的悲剧画面. 如同视频中的配乐,每一次失败,并不能动摇航天飞机冲向太空的决心,航天飞机的再次发射升空令失去得到尊重. 现在,她完美的谢幕,科技永不止步,下一代STS(Space Transportation System)会更强大.

Java 任务处理

- - 码蜂笔记
最近梳理其他同事以前写的 job 后有点想法,记录下. 在大多数的系统都有类似这样的逻辑,比如下单了给用户赠送积分,用户在论坛上发表了帖子,给用户增加积分等等. 下单赠送积分,那么一个订单肯定不能重复赠送积分,所以需要一些状态来比较来哪些是已赠送的,哪些是没有赠送的. 或许可以在订单表里加个字段来标记是否赠送了积分.

Linux Crontab 定时任务

- - CSDN博客推荐文章
crontab命令的功能是在一定的时间间隔调度一些命令的执行. 1.1 /etc/Crontab文件. 在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序. 每个用户可以建立自己的调度crontab(在/var/spool/cron目录下). 以下是我本机上的crontab文件,.

浅谈多任务管理

- tossking - 爱范儿 · Beats of Bits
移动系统的多任务管理看起来是个很简单的问题,但是实际做好却并不容易. Android 2.x 和 iOS. 在使用  Android 2.x 或 iOS 的过程中,多任务管理几乎是个废弃的功能. 在进行应用切换的时候,与其使用多任务管理界面,不如直接返回主屏更方便. 先看 android 2.x,多任务管理界面只显示最近打开过的六个应用的图标,想切换到的应用常常被挤掉,或者挤在一堆暂时无用的应用中间.

quartz 任务的增删改

- - 编程语言 - ITeye博客
从网上找了好多例子,要么太老,要么用不了. * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名. * @param jobName 任务名. * @param cls 任务. * @param time 时间设置,参考quartz说明文档. Scheduler scheduler = schedulerFactory.getScheduler();//创建一个触发器表.

mysql 定时任务执行

- - 数据库 - ITeye博客
 查看待执行event:.       创建执行活动.       执行周期以及起始时间等.     两种:1.在某个时间点执行:at 某个时间点+某个时间长度:. 如上面的:AT CURRENT_TIMESTAMP + INTERVAL 10 SECOND 标识从现在起,10秒后执行;.                2.周期性执行:every 每间隔多长时间执行一次,从 某时间点开始,到某个时间点结束.