quartz定时任务2Word文档格式.docx
《quartz定时任务2Word文档格式.docx》由会员分享,可在线阅读,更多相关《quartz定时任务2Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
自己写的“定时程序”实现此接口的voidexecute(JobExecutionContextarg0)方法,Job还有一类为有状态的StatefulJob接口,如果我们需要在上一个作业执行完后,根据其执行结果再进行下次作业的执行,则需要实现此接口。
Trigger抽象类:
调度类(Scheduler)在时间到时调用此类,再由trigger类调用指定的定时程序。
Quertz中提供了两类触发器为:
SimpleTrigger,CronTrigger。
前者用于实现比较简单的定时功能,例如几点开始,几点结束,隔多长时间执行,共执行多少次等,后者提供了使用表达式来描述定时功能,因此适用于比较复杂的定时描述,例如每个月的最后一个周五,每周的周四等。
JobDetail类:
具体某个定时程序的详细描述,包括Name,Group,JobDataMap等。
JobExecutionContext类:
定时程序执行的run-time的上下文环境,用于得到当前执行的Job的名字,配置的参数等。
JobDataMap类:
用于描述一个作业的参数,参数可以为任何基本类型例如String,float等,也可为某个对象的引用.
JobListener,TriggerListener接口:
用于监听触发器状态和作业扫行状态,在特写状态执行相应操作。
JobStore类:
在哪里执行定进程序,可选的有在内存中,在数据库中。
开始:
边看例题边学习,首先从简单触发器开始……
1、作业通过实现org.quartz.job接口,可以使Java类变成可执行的。
这个类用一条非常简单的输出语句覆盖了execute(JobExecutionContextcontext)方法。
程序代码:
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
publicclassSimpleQuartzJobimplementsJob{
publicSimpleQuartzJob(){
}
publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{
System.out.println("
InSimpleQuartzJob-executingitsJOBat"
+newDate()+"
by"
+context.getTrigger().getName());
}
2、触发器和调度器
publicvoidtask()throwsSchedulerException
{
//通过SchedulerFactory来获取一个调度器
SchedulerFactoryschedulerFactory=newStdSchedulerFactory();
Schedulerscheduler=schedulerFactory.getScheduler();
//引进作业程序
JobDetailjobDetail=
newJobDetail("
jobDetail-s1"
"
jobDetailGroup-s1"
SimpleQuartzJob.class);
//new一个触发器
SimpleTriggersimpleTrigger=
newSimpleTrigger("
simpleTrigger"
triggerGroup-s1"
);
//设置作业启动时间
longctime=System.currentTimeMillis();
simpleTrigger.setStartTime(newDate(ctime));
//设置作业执行间隔
simpleTrigger.setRepeatInterval(10000);
//设置作业执行次数
simpleTrigger.setRepeatCount(10);
//设置作业执行优先级默认为5
//simpleTrigger.setPriority(10);
//作业和触发器设置到调度器中
scheduler.scheduleJob(jobDetail,simpleTrigger);
//启动调度器
scheduler.start();
一个简单的quartz任务就完成了Quartz定时发送消息的功能,该功能依附于Web应用上,即当Web应用启动时,该应用就开始作用。
起先决定使用java.util.Timer和java.util.TimerTask来实现,但是研究了一下以后发现JavaTimer的功能比较弱,而且其线程的范围不受Web应用的约束。
后来发现了Quartz这个开源的调度框架,非常有趣。
首先我们要得到Quartz的最新发布版。
目前其最新的版本是1.6。
我们可以从以下地址获得它的完整下载包,包中可谓汤料十足,不仅有我们要的quartz.jar,更包含多个例程和详细的文档,从API到配置文件的XSD一应俱全。
感兴趣的朋友也可以在src目录下找到该项目的源码一看究竟。
废话少说,下面就来看一看这个东东是怎么在JavaWebApplication中得以使用的。
首先不得不提出的是Quartz的三个核心概念:
调度器、触发器、作业。
让我们来看看他们是如何工作的吧。
一.作业总指挥——调度器1.Scheduler接口该接口或许是整个Quartz中最最上层的东西了,它提携了所有触发器和作业,使它们协调工作。
每个Scheduler都存有JobDetail和Trigger的注册,一个Scheduler中可以注册多个JobDetail和多个Trigger,这些JobDetail和Trigger都可以通过groupname和他们自身的name加以区分,以保持这些JobDetail和Trigger的实例在同一个Scheduler内不会冲突。
所以,每个Scheduler中的JobDetail的组名是唯一的,本身的名字也是唯一的(就好像是一个JobDetail的ID)。
Trigger也是如此。
Scheduler实例由SchedulerFactory产生,一旦Scheduler实例生成后,我们就可以通过生成它的工厂来找到该实例,获取它相关的属性。
下面的代码为我们展示了如何从一个Servlet中找到SchedulerFactory并获得相应的Scheduler实例,通过该实例,我们可以获取当前作业中的testmode属性,来判断该作业是否工作于测试模式。
Java代码
//从当前Servlet上下文中查找StdSchedulerFactory
ServletContextctx=request.getSession().getServletContext();
StdSchedulerFactoryfactory=(StdSchedulerFactory)ctx.getAttribute("
org.quartz.impl.StdSchedulerFactory.KEY"
Schedulersch=null;
try{
//获取调度器
sch=factory.getScheduler("
SchedulerName"
//通过调度器实例获得JobDetail,注意领会JobDetailName和GroupName的用法
JobDetailjd=sch.getJobDetail("
JobDetailName"
GroupName"
Mapjobmap1=jd.getJobDataMap();
istest=jobmap1.get("
testmode"
)+"
"
;
}catch(Exceptionse){
//如果得不到当前作业,则从配置文件中读取testmode
ReadXML("
job.xml"
).get(“job.testmode”);
}//从当前Servlet上下文中查找StdSchedulerFactory
}
Scheduler实例生成后,它处于"
stand-by"
模式,需要调用其start方法来使之投入运作。
publicclassSendMailShedule{
//设置标准SchedulerFactory
staticSchedulerFactoryschedFact=neworg.quartz.impl.StdSchedulerFactory();
staticSchedulersched;
publicstaticvoidrun()throwsException{
//生成Scheduler实例
sched=schedFact.getScheduler();
//创建一个JobDetail实例,对应的Job实现类是SendMailJob
JobDetailjobDetail=newJobDetail("
myJob"
sched.DEFAULT_GROUP,SendMailJob.class);
//设置CronTrigger,利用Cron表达式设定触发时间
CronTriggertrigger=newCronTrigger("
myTrigger"
"
test"
0081*?
sched.scheduleJob(