Quartz
Job (任务)
每个任务都要实现该接口。该接口只有一个executor方法。被调用时,schduler会传入一个JobExecutionContext。
job的状态:job默认是无状态的,即每次调度都会初始化一个新jobDataMap,jobDataMap中的值不会被保存,因此称之为无状态Job。用@PersistJobDataAfterExecution注解Job类,可以将其设置为有状态的,即多次调用这个job使用同一个jobDateMap,jobDateMap中对值的修改也就会被保存,并在以后的调用中可见,因此称之为有状态Job
JobDetail
Scheduler调度的对象,JobDetail持有Job的class,每次调度都会使用class产生一个新Job对象。除了持有jobDetail外,它还持有JobKey、jobDateMap等对象
jobKey
jobDetail的标识对象,有任务名称、组名、描述等数据,组名默认为DEFAULT。
jobDateMap
Java.util.Map的实现,以键值对形式持有数据。这是个Map。
Job之JobExecutionContext
scheduler生成的对象,持有jobDetail和trigger对象,这个对象会在调用job时作为参数被传入,因此可以在Job获取这两个对象,以及其中的key、dateMap等值,从而实现了jobDetail、trigger和job的通信。此外,该类还持有一些其他数据,如任务上次被调用的时间,本次被调用的时间,下次被调用的时间等。
Trigger(触发器)
定义触发条件,当满足条件时,scheduler调用jobDetail中的Job实例。和Jobdetail类似,持有triggerKey、jobDateMap。Trigger可以设置任务开始时间,任务结束时间,任务调度计划(Schduler对象)等。Trigger的结束时间具有最高的优先级,即当到达结束时间后,即使还有任务没有被调度,调度也会停止,没有被调度的任务也就不会被执行。Job对Trigger是1对N的关系。
Trigger之SchedulerBuilder(调度安排,和Scheduler不同)
触发器持有一个该对象,执行器根据其设置安排调度。SchedulerBuilder用于设置任务执行的时间。Scheduler用于执行任务。
SimpleSchedule:基于时间的调度器,可以设置在周期执行,固定时间执行,执行固定次数等
CornSchedule:基于日历的调度器,可以按秒、分、时、周、日、月、年设置执行,功能强大。用corn表达式表示调度。
SchedulerFactory
生产Scheduler的工厂方法。Scheduler
stdSchedulerFactory:根据配置文件进行初始化,可以自定义配置文件,并作为参数传入ScheduelrFactory以生产Scheduler。该方法根据配置文件生成单实例的Scheduler对象。
directSchedulerFactory:包含线程池等用法
Scheduler
scheduleJob(jobDetail, trigger);//关联任务和触发器,一个任务可以关联多个触发器。每个触发器的触发条件都可以让任务被调度执行,该方法返回一个任务被启动时的Date。
start();//开始任务调度
standBy();//挂起任务
shutDown(Boolean);//true 等待任务执行完毕再关闭schedule,false 直接关闭schedule,shutDown()以后无法再启动。
delete(JobKey); //从schedule中根据JobKey删除jobDetail(Job)
Quartz.properties
默认的quartz.properties在org.quartz包下,stdSchedulerFactory默认使用该配置文件生成Scheduler实例。
instanceName:调度器的名称
instanceId:一般设置未AUTO即可,该值在集群环境下才能发挥作用。
threadCount:该调度器使用多少个线程来执行任务。最小为1,没有上限,但推荐最大不要超多100,否则线程池太大,占据太多资源,反而不利于任务调度。
threadPriority:设置线程的优先级
threadPool.class:线程池类,使用该类生成线程池。一般使用默认的SimpleThreadPool.class即可
Job监听器
实现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监听器
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监听器
scheduler监听器实现的是SchedulerListener接口。实现和注册与上述两个类似。接口中各函数的作用具体参见API文档。
builder模式
JobDetail、Trigger使用了Builder模式构造对象。
浙公网安备 33010602011771号