还有一个呢就是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(); } } }