每一个任务都要实现该接口。该接口只有一个executor方法。被调用时,schduler会传入一个JobExecutionContext。ide
job的状态:job默认是无状态的,即每次调度都会初始化一个新jobDataMap,jobDataMap中的值不会被保存,所以称之为无状态Job。用@PersistJobDataAfterExecution注解Job类,能够将其设置为有状态的,即屡次调用这个job使用同一个jobDateMap,jobDateMap中对值的修改也就会被保存,并在之后的调用中可见,所以称之为有状态Job函数
Scheduler调度的对象,JobDetail持有Job的class,每次调度都会使用class产生一个新Job对象。除了持有jobDetail外,它还持有JobKey、jobDateMap等对象ui
jobKeyspa
jobDetail的标识对象,有任务名称、组名、描述等数据,组名默认为DEFAULT。线程
jobDateMapcode
Java.util.Map的实现,以键值对形式持有数据。这是个Map。对象
scheduler生成的对象,持有jobDetail和trigger对象,这个对象会在调用job时做为参数被传入,所以能够在Job获取这两个对象,以及其中的key、dateMap等值,从而实现了jobDetail、trigger和job的通讯。此外,该类还持有一些其余数据,如任务上次被调用的时间,本次被调用的时间,下次被调用的时间等。blog
定义触发条件,当知足条件时,scheduler调用jobDetail中的Job实例。和Jobdetail相似,持有triggerKey、jobDateMap。Trigger能够设置任务开始时间,任务结束时间,任务调度计划(Schduler对象)等。Trigger的结束时间具备最高的优先级,即当到达结束时间后,即便还有任务没有被调度,调度也会中止,没有被调度的任务也就不会被执行。Job对Trigger是1对N的关系。接口
触发器持有一个该对象,执行器根据其设置安排调度。SchedulerBuilder用于设置任务执行的时间。Scheduler用于执行任务。资源
SimpleSchedule:基于时间的调度器,能够设置在周期执行,固定时间执行,执行固定次数等
CornSchedule:基于日历的调度器,能够按秒、分、时、周、日、月、年设置执行,功能强大。用corn表达式表示调度。
生产Scheduler的工厂方法。Scheduler
stdSchedulerFactory:根据配置文件进行初始化,能够自定义配置文件,并做为参数传入ScheduelrFactory以生产Scheduler。该方法根据配置文件生成单实例的Scheduler对象。
directSchedulerFactory:包含线程池等用法
scheduleJob(jobDetail, trigger);//关联任务和触发器,一个任务能够关联多个触发器。每一个触发器的触发条件均可以让任务被调度执行,该方法返回一个任务被启动时的Date。
start();//开始任务调度
standBy();//挂起任务
shutDown(Boolean);//true 等待任务执行完毕再关闭schedule,false 直接关闭schedule,shutDown()之后没法再启动。
delete(JobKey); //从schedule中根据JobKey删除jobDetail(Job)
默认的quartz.properties在org.quartz包下,stdSchedulerFactory默认使用该配置文件生成Scheduler实例。
instanceName:调度器的名称
instanceId:通常设置未AUTO便可,该值在集群环境下才能发挥做用。
threadCount:该调度器使用多少个线程来执行任务。最小为1,没有上限,但推荐最大不要超多100,不然线程池太大,占据太多资源,反而不利于任务调度。
threadPriority:设置线程的优先级
threadPool.class:线程池类,使用该类生成线程池。通常使用默认的SimpleThreadPool.class便可
实现JobListener接口,获得一个监听类。在scheduler中,添加监听器到一个Job或到全部Job。当这个Job在执行前、执行后、阻断后,监听器中的相关方法会被调用。
public class HelloJobListener implements JobListener{ @Override public String getName() { // TODO Auto-generated method stub return "hello world,I am a job listenner"; } //job被执行前被调用,若是job被阻断,那么该方法不会被调用,~~Voted方法将被调用 @Override public void jobToBeExecuted(JobExecutionContext context) { // TODO Auto-generated method stub System.out.println(context.getJobDetail().getKey().getName()+"将被执行"); } //job被阻断时被调用(TriggerListener能够阻断job的执行) @Override public void jobExecutionVetoed(JobExecutionContext context) { // TODO Auto-generated method stub System.out.println(context.getJobDetail().getKey().getName()+"被阻止执行"); } //job被执行完成后被调用,若是job被阻断,也就不会获得执行,也就不会被执行完成,此方法也就不会被调用 @Override public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { // TODO Auto-generated method stub System.out.println(context.getJobDetail().getKey().getName()+"执行完毕"); }
注册全局监听器和局部监听器
全局监听器:全部job都会被监听
局部监听器:只监听该监听器注册的Job
//启动调度 scheduler.scheduleJob(jobDetail, trigger); //添加一个全局Joblistener(和全部job匹配) //scheduler.getListenerManager().addJobListener(new HelloListenner(),EverythingMatcher.allJobs()); //添加一个局部Joblistener(根据jobKey匹配) scheduler.getListenerManager().addJobListener(new HelloJobListener(),KeyMatcher.keyEquals(jobDetail.getKey())); scheduler.start();
Trigger监听器和Job监听器相似
public class HelloTriggerListener implements TriggerListener{ @Override public String getName() { // TODO Auto-generated method stub return "TriggerListener YY"; } //触发器先于任务(触发器触发任务),所以触发器监听器先于任务监听器 //触发器被触发时调用该方法 @Override public void triggerFired(Trigger trigger, JobExecutionContext context) { System.out.println(trigger.getKey().getName()+"被触发了"); } //···Fired方法被调用完成后,此方法会被调用,若是返回true,就会阻断job,jobListener的```voted方法就会被调用 @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { System.out.println(trigger.getKey().getName()+"被投票了,本次经过"); return true; } @Override public void triggerMisfired(Trigger trigger) { // TODO Auto-generated method stub System.out.println(trigger.getKey().getName()+"错过执行了"); } //触发器触发的任务被完成后调用该方法,该方法后于jobListener的```wasExecuted方法。 @Override public void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode) { // TODO Auto-generated method stub System.out.println(trigger.getKey().getName()+"触发完成"); } }
TriggerListener的注册也和JobListener相似
.build(); //触发器的监听先于任务的监听执行 //触发器的监听能够阻止任务执行 //正确执行的顺序以下: //1:triggerListener的fire方法 //2:triggerListener的vote方法(返回true,则job调度被阻断,直接调用JobListener的Voted方法,而后结束) //3:jobListener的ToBeExecuted方法 //4:job的execute方法 //5:jobListener的wasExecuted方法 //6:triggerListener的Complete方法 //触发器监听的注册和任务监听的注册相似,能够注册全局和局部监听器 scheduler.scheduleJob(jobDetail, trigger); scheduler.getListenerManager().addJobListener(new HelloJobListener(),EverythingMatcher.allJobs()); scheduler.getListenerManager().addTriggerListener(new HelloTriggerListener(),EverythingMatcher.allTriggers()); scheduler.start();
scheduler监听器实现的是SchedulerListener接口。实现和注册与上述两个相似。接口中各函数的做用具体参见API文档。
JobDetail、Trigger使用了Builder模式构造对象。