博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
任务调度开源框架Quartz动态加入、改动和删除定时任务
阅读量:6650 次
发布时间:2019-06-25

本文共 8735 字,大约阅读时间需要 29 分钟。

        Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包括了调度器监听、作业和触发器监听。你能够配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 同意开发者依据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序能够重用来自不同事件的作业,还能够为一个事件组合多个作业。而且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,非常好非常强大!好啦,直接上代码:

/** * @Description:  * * @Title: QuartzManager.java * @Package com.joyce.quartz * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:15:52 * @version V2.0 */package com.joyce.quartz;import org.quartz.CronTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.impl.StdSchedulerFactory;/** * @Description: 定时任务管理类 *  * @ClassName: QuartzManager * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:15:52 * @version V2.0 */public class QuartzManager {	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();	private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";	private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";	/**	 * @Description: 加入一个定时任务,使用默认的任务组名,触发器名,触发器组名	 * 	 * @param jobName	 *            任务名	 * @param cls	 *            任务	 * @param time	 *            时间设置,參考quartz说明文档	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:47:44	 * @version V2.0	 */	@SuppressWarnings("unchecked")	public static void addJob(String jobName, Class cls, String time) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务运行类			// 触发器			CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组			trigger.setCronExpression(time);// 触发器时间设定			sched.scheduleJob(jobDetail, trigger);			// 启动			if (!sched.isShutdown()) {				sched.start();			}		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description: 加入一个定时任务	 * 	 * @param jobName	 *            任务名	 * @param jobGroupName	 *            任务组名	 * @param triggerName	 *            触发器名	 * @param triggerGroupName	 *            触发器组名	 * @param jobClass	 *            任务	 * @param time	 *            时间设置,參考quartz说明文档	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:48:15	 * @version V2.0	 */	@SuppressWarnings("unchecked")	public static void addJob(String jobName, String jobGroupName,			String triggerName, String triggerGroupName, Class jobClass,			String time) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务运行类			// 触发器			CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组			trigger.setCronExpression(time);// 触发器时间设定			sched.scheduleJob(jobDetail, trigger);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description: 改动一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)	 * 	 * @param jobName	 * @param time	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:49:21	 * @version V2.0	 */	@SuppressWarnings("unchecked")	public static void modifyJobTime(String jobName, String time) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);			if (trigger == null) {				return;			}			String oldTime = trigger.getCronExpression();			if (!oldTime.equalsIgnoreCase(time)) {				JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);				Class objJobClass = jobDetail.getJobClass();				removeJob(jobName);				addJob(jobName, objJobClass, time);			}		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description: 改动一个任务的触发时间	 * 	 * @param triggerName	 * @param triggerGroupName	 * @param time	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:49:37	 * @version V2.0	 */	public static void modifyJobTime(String triggerName,			String triggerGroupName, String time) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);			if (trigger == null) {				return;			}			String oldTime = trigger.getCronExpression();			if (!oldTime.equalsIgnoreCase(time)) {				CronTrigger ct = (CronTrigger) trigger;				// 改动时间				ct.setCronExpression(time);				// 重新启动触发器				sched.resumeTrigger(triggerName, triggerGroupName);			}		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)	 * 	 * @param jobName	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:49:51	 * @version V2.0	 */	public static void removeJob(String jobName) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器			sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器			sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description: 移除一个任务	 * 	 * @param jobName	 * @param jobGroupName	 * @param triggerName	 * @param triggerGroupName	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:50:01	 * @version V2.0	 */	public static void removeJob(String jobName, String jobGroupName,			String triggerName, String triggerGroupName) {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器			sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器			sched.deleteJob(jobName, jobGroupName);// 删除任务		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description:启动全部定时任务	 * 	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:50:18	 * @version V2.0	 */	public static void startJobs() {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			sched.start();		} catch (Exception e) {			throw new RuntimeException(e);		}	}	/**	 * @Description:关闭全部定时任务	 * 	 * 	 * @Title: QuartzManager.java	 * @Copyright: Copyright (c) 2014	 * 	 * @author Comsys-LZP	 * @date 2014-6-26 下午03:50:26	 * @version V2.0	 */	public static void shutdownJobs() {		try {			Scheduler sched = gSchedulerFactory.getScheduler();			if (!sched.isShutdown()) {				sched.shutdown();			}		} catch (Exception e) {			throw new RuntimeException(e);		}	}}
以上就是quartz任务调度对于任务的经常使用操作,封装起来以便在外部调用!这样我们就须要任务的运行了:
/** * @Description:  * * @Title: QuartzJob.java * @Package com.joyce.quartz * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:37:11 * @version V2.0 */package com.joyce.quartz;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;/** * @Description: 任务运行类 * * @ClassName: QuartzJob * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:37:11 * @version V2.0 */public class QuartzJob implements Job {	@Override	public void execute(JobExecutionContext arg0) throws JobExecutionException {		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");  	}}
Ok,我们来測试一下:
/** * @Description:  * * @Title: QuartzTest.java * @Package com.joyce.quartz.main * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:35:05 * @version V2.0 */package com.joyce.quartz.main;import com.joyce.quartz.QuartzJob;import com.joyce.quartz.QuartzManager;/** * @Description: 測试类 * * @ClassName: QuartzTest * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:35:05 * @version V2.0 */public class QuartzTest {	public static void main(String[] args) {		try {			String job_name = "动态任务调度";			System.out.println("【系统启动】開始(每1秒输出一次)...");  			QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");  						Thread.sleep(5000);  			System.out.println("【改动时间】開始(每2秒输出一次)...");  			QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");  			Thread.sleep(6000);  			System.out.println("【移除定时】開始...");  			QuartzManager.removeJob(job_name);  			System.out.println("【移除定时】成功");  						System.out.println("【再次加入定时任务】開始(每10秒输出一次)...");  			QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");  			Thread.sleep(60000);  			System.out.println("【移除定时】開始...");  			QuartzManager.removeJob(job_name);  			System.out.println("【移除定时】成功");		} catch (Exception e) {			e.printStackTrace();		}	}}
执行一下,看看效果图:

至于定时的配置的话,有兴趣的各位能够去看看Quartz的cron表达式,这里就不给大伙儿介绍了哈!问问度娘,这资料非常全面地!最后来给附上本人的地址:

你可能感兴趣的文章
Python标准库——走马观花
查看>>
Decode Ways
查看>>
关于字符串指针不可修改的问题
查看>>
DEFT Linux 7.2,数字取证工具箱
查看>>
CentOS 6.3(x86_32)下安装Oracle 10g R2
查看>>
《x86/x64体系探索及编程》图书信息
查看>>
【Android】drawable—hdpi、drawable—mdpi、drawable—ldp
查看>>
Hibernate 参数设置一览表
查看>>
AppBox v2.0 发布了!
查看>>
Java 基础【03】TCP
查看>>
中文字体在CSS中的表达方式
查看>>
转义字符符号及对应的含义
查看>>
返回顶部的js实现
查看>>
回顾各种编码的创新和异同-MEPG2, MPEG4, H.264/AVC以及H.265/HEVC比较(转)
查看>>
PowerShell批量重启计算机
查看>>
【转贴】短息分类和短信接收指令
查看>>
extjs form 取值 赋值 重置
查看>>
C# 委托一(委托基础)
查看>>
为什么你的“努力”一文不值?
查看>>
Javascript正则构造函数与正则表达字面量&&常用正则表达式
查看>>