开源定时器quartz入门

闲来无事学习了下quartz框架,其实JAVA下的定时器框架还有几个,比如java.util.Timer可以实现简单的定时器任务,但是呢这个东东有个缺点就是一个Timer内部只开了一个线程来跑的,所以它只适合做最简单的单任务事情,如果有多件事情在同一时刻发生,那么它只能做完其中一件事情才能再去做另外一件事情,请看:http://jqsl2012.iteye.com/blog/1188184

还有一个呢就是jdk1.5出的java.util.concurrent.*,这个东东可以同时处理N件事情,但是呢如果你想处理比较复杂的定时任务,就得自己搞了,其实可以借助与java.util.Calendar这个强大的日历类来做。

在平时项目中许多人都是用的quartz,有的用它和struts或spring结合在一起处理可配置的定时任务,平时任务没让我去弄这个,于是空闲下来就弄下,图个新鲜。


边弄便粗略的看看源码,发现quartz的源码写的好像jQuery的源码啊,那种链式的写法,很优雅,它的类和接口以及方法的命名真是GOOD,今天就只做了个简单的例子,也简单的看了下org.quartz.*这个包的部分类接口和方法,看的不多。感觉这个东东还是很值得去研究下里。

牢骚一句,相比傻不拉唧的码代码,我还是更愿意看看jdk啊看看算法数据结构。


quartz第一天的代码:
package quartz;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

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

public class SimpleJobDemo1 implements Job {

	private Calendar calendar = new GregorianCalendar();

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		calendar.setTime(new Date());
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int hh = calendar.get(Calendar.HOUR_OF_DAY);
		int mi = calendar.get(Calendar.MINUTE);
		int ss = calendar.get(Calendar.SECOND);
		String s = year + "-" + month + "-" + day + " " + hh + ":" + mi + ":"
				+ ss;
		System.out.println(s + ",triggerName:"
				+ context.getTrigger().getKey().getName() + ",triggerGroup:"
				+ context.getTrigger().getKey().getName() + ",jobName:"
				+ context.getJobDetail().getKey().getName() + ",jobGroup:"
				+ context.getJobDetail().getKey().getGroup() + ",jobMap:"
				+ context.getTrigger().getJobDataMap().getWrappedMap());
	}
}


package quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTriggerDemo1 {
	public static void main(String[] args) {
		new SimpleTriggerDemo1().task();

	}

	/**
	 * quartz的类写的很优雅,类的方法能进行连写,和jQuery很像,好处很明显,优雅的同时也减少了代码,提高了创建类对象的使用
	 * 
	 * quartz包含job和trigger两个概念,job就是你要做的事情,trigger当然是触发器,他们都是有名称和组的,并且还有参数,
	 * 这个参数呢其实就是一个quartz自己搞的一个继承了java.util.Map的类org.quartz.JobDataMap。
	 * 基本上org.quartz.*包能完成大部分的定时器的任务,因为初学这个所以今天也就只看了这个包的内容,感觉还是非常容易伤手的。
	 * 总结:org.quartz.*包下基本上搞懂job、trigger、scheduler这3个相关的东西就行了,因为定时相关的就是围绕这3个东西展开的。
	 */
	public void task() {
		SchedulerFactory facroty = new StdSchedulerFactory();
		try {
			Scheduler scheduler = facroty.getScheduler();
			JobDetail jobDetail = JobBuilder.newJob(SimpleJobDemo1.class)
					.withIdentity(new JobKey("job名称", "job组名称")).build();
			JobDataMap newJobDataMap = new JobDataMap();
			newJobDataMap.put("key1", "value1");
			newJobDataMap.put("key2", "value2");
			Trigger trigger = TriggerBuilder
					.newTrigger()
					// 添加身份标识,可以添加或不添加
					.withIdentity(new TriggerKey("trigger名称", "trigger组名称"))
					.withSchedule(
							SimpleScheduleBuilder.simpleSchedule()
									.withIntervalInSeconds(1).repeatForever())
//					.withSchedule(CronScheduleBuilder.cronSchedule(""))
					.usingJobData(newJobDataMap)
					.startAt(
					// future将来的意思,futureDate就是将来的某个时间执行
							DateBuilder.futureDate(2, IntervalUnit.SECOND))
					.build();

			Trigger trigger2 = TriggerBuilder
			.newTrigger()
			// 添加身份标识,可以添加或不添加
			.withIdentity(new TriggerKey("trigger名称2", "trigger组名称2"))
			.withSchedule(
					SimpleScheduleBuilder.simpleSchedule()
					.withIntervalInSeconds(2).repeatForever())
					.startAt(
							// future将来的意思,futureDate就是将来的某个时间执行
							DateBuilder.futureDate(5, IntervalUnit.SECOND))
							.forJob(jobDetail).build();

			scheduler.scheduleJob(jobDetail, trigger);
			scheduler.scheduleJob(trigger2);//同一个job添加多个trigger
			scheduler.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
}

猜你喜欢

转载自jqsl2012.iteye.com/blog/1260666