Quartz作业调度,不再让我们烦恼

✪  前言

         你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。

✪  Quartz发展介绍

        和现在许多的开源项目一样,Quartz在创立之初只是为个人开发者提供一个简单的实现方案,但是随着日益增多的人员参与和贡献,Quartz开始成为众所周知,并且能帮助IT攻城狮解决大问题的一个框架!

        在1998年最初的构思中,Quartz 包括作业队列的概念,使用线程池 处理作业。在接下来的数年中,James House 一直在关注着一个目标:一个灵活的作业调度工具;带着有限的选择和浓厚的兴趣,James House 终于在2001年春天,创立了该项目:http://sourceforge.net/projects/quartz,虽然项目仍然有效,但是已经不再维护;

✪  Quartz的体系结构

                      

    详细讲解如下:


✪  实例小demo

 新建java project

         导入quartz框架所需的jar包:log4j-1.2.1.jar , quartz-2.1.1.jar, slf4j-api-1.6.1.jar, slf4j-log4j12-1.6.1.jar

        

✎ 在job包下新建两个类:

          MyJob.java 和 threadTest.java (threadTest.java 类主要是为了测试 quartz框架支持多线程的情况):

      MyJob.java :

package job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("quartz定时任务1:" + new Date());
	}
}
       threadTest.java:
<span style="font-size:18px;">package job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class threadTest implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("quartz 定时任务2:" + new Date());
	}
}</span>

✎ 建立一个包,并新建一个java类:TestJob.java

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import job.MyJob;
import job.threadTest;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;


public class TestJob {

	private static Scheduler sched = null;
	/**
	 * @param args
	 * @throws SchedulerException 
	 */
	public static void main(String[] args) throws SchedulerException {
		TestJob t = new TestJob();
		t.useJob();     //启动 scheduler;
//		t.addJob("myjob1", "1/1 * * ? * *", MyJob.class);//启动任务,从第一秒开始,每隔1s执行一次MyJob任务
//		t.addJob("myjob1", "1/2 * * ? * *", MyJob.class);//启动任务,从第一秒开始,每隔2s执行一次MyJob任务
		t.addJob("myjob1", "1/5 * * ? * *", MyJob.class);//启动任务,从第一秒开始,每隔5s执行一次MyJob任务
		t.addJob("myjob2", "1/5 * * ? * *", threadTest.class);//启动任务,从第一秒开始,每隔5s执行一次MyJob任务
//		t.deleteJob("myjob1");//停止任务
	}
	
	/**
	 * 启动Schedule
	 * @throws SchedulerException
	 */
	public void useJob() throws SchedulerException{		
		SchedulerFactory sf = new StdSchedulerFactory();
		 try {
			sched = sf.getScheduler();
			sched.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 任务中添加作业
	 * @param jobName 任务名称,可以自己命名
	 * @param spaceTime corn表达式,调用的时间,例如“5 * * ? * *”
	 * @param clazz job实现类
	 */
	public void addJob(String jobName,String spaceTime,Class clazz){
		String groupName = jobName;
		JobDetail jobs = newJob(clazz).withIdentity(jobName,groupName).build();
		CronTrigger trigger; 
		try {
			if(sched.isShutdown()){
				sched.start();
			}
			trigger = newTrigger().withIdentity(jobName+groupName, groupName).withSchedule(cronSchedule(spaceTime)).build();
			sched.scheduleJob(jobs, trigger);
		} catch (Exception e) {
			e.printStackTrace();
			new Exception(e);
		} 
	
	}
	
	/**
	 * 在任务中删除改作业
	 * @param jobName
	 */
	public void deleteJob(String jobName){
		String groupName = jobName;
		try {
			if(sched.isShutdown()){
				sched.start();
			}else{
				JobKey key = new JobKey(jobName,groupName);
				sched.deleteJob(key);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
			new Exception(e);
		}
	}

}
           这样,我们就可以将web项目添加到tomcat中,直接运行main()方法,我们会发现console中打印出以下信息:

而决定定时任务执行频率的是在main方法中 克隆表达式,所以小编将在下一篇博客中

进行具体介绍;到这里,关于Quartz框架从基本情况到具体使用的总结分享就结束了,

希望能帮到大家!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章