? ? ? ? ? ? ? 最近项目里面有用到Quartz框架来开发一些定时任务等,之前是没有接触过它,因此在认真研究后,把我自己的一些学习心得与所写的例子记录在这里。
? ? ? ? ? ? ? 前几天又再次回顾了以前了解过的一些设计模式,并决心以博客的形式记录与此,主要有两个目的,第一:如果哪天我对这些知识点忘记了,我可以随时拿起手机进行回顾;第二:如果这些知识点能够帮助别人学习那就是再好不过的事了。才记录不到几篇的内容就收到了一些网友的评论,其中有鼓励的声音,也有批评的声音,同时也有怀疑的声音。对于这些我都会欣然去接受,我觉得它们都是对自己的鼓励。同时我想说:“在知识的大森林中我永远想做一只不断追求的菜鸟”。欢迎各位的指正,这将是我莫大的动力。
?
? ? ?首先你需要去下载Quartz,并在MyEclipse中创建一个Java工程,并加入一些jar包,如:我这里加入的包,commons-beanutils.jar,commons-codec.jar,commons-collections-3.1.jar,commons-dbcp-1.2.1.jar,
commons-digester-1.8.jar,commons-logging-1.1.jar,commons-pool.jar,quartz-1.6.0.jar。
? ? 每一个quartz job的实现类,都在实现Quartz的job接口,并实现这个接口中的唯一方法:execute。如下代码:
class="java" name="code">package com.dsl.myjob; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class TestJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("enter execute function..."+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); JobDetail jd=context.getJobDetail(); JobDataMap jdm=jd.getJobDataMap(); String hi=jdm.getString("HI"); if(hi!=null){ System.out.println(hi); } String name=jdm.getString("NAME"); if(name!=null){ System.out.println(name); } } }
?当 Quartz 调度器确定到时间要激发一个 Job 的时候,它就会生成一个 Job 实例,并调用这个实例的 execute() 方法。调度器只管调用 execute() 方法,而不关心执行的结果.
SimpleScheduler类:
package com.dsl.myjob; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class SimpleScheduler { /** * @param args */ public static void main(String[] args) { SimpleScheduler simple=new SimpleScheduler(); //创建调度器并调度job try { Scheduler sch=simple.createScheduler(); simple.schedulJob(sch); sch.start();//这一步很重要,如果不调start 那么调度器不会启用 //sch.shutdown();//只用调这个方法时,调度器才会关闭 } catch (SchedulerException e) { System.out.println(e); } } private void schedulJob(Scheduler sch) throws SchedulerException { //为job create 一个JobDetail JobDetail jobDetail=new JobDetail("ScanDirectory",Scheduler.DEFAULT_GROUP,TestJob.class); //创建一个每10秒运和的触发器 Trigger trigger=TriggerUtils.makeSecondlyTrigger(10); trigger.setName("scanTrigger");//设置trigger的名称 //设置第一次出发时间 trigger.setStartTime(new Date()); //关联trigger和job sch.scheduleJob(jobDetail,trigger); //--- } //create 调度器 private Scheduler createScheduler() throws SchedulerException { return StdSchedulerFactory.getDefaultScheduler(); } }
?
?可是这样写却有很多不方便之处:
1、因为每一个 Job 都必须用 Scheduler 来注册,所以先定义一个 JobDetail,并关联到这个 Scheduler的 实例。如果我想重用一个Job类,并让它产生多个实例,那们你就要为它创建多个JobDetail 并在Scheduler注册,这样就不爽了。
2、如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译,这样也不方便。
? ? ? ? 所以Quartz它提供了方便的基于配置的实现。学习二中将提到。?