Quartz

Job (任务)

  每一个任务都要实现该接口。该接口只有一个executor方法。被调用时,schduler会传入一个JobExecutionContext。ide

  job的状态:job默认是无状态的,即每次调度都会初始化一个新jobDataMap,jobDataMap中的值不会被保存,所以称之为无状态Job。用@PersistJobDataAfterExecution注解Job类,能够将其设置为有状态的,即屡次调用这个job使用同一个jobDateMap,jobDateMap中对值的修改也就会被保存,并在之后的调用中可见,所以称之为有状态Job函数

JobDetail

  Scheduler调度的对象,JobDetail持有Job的class,每次调度都会使用class产生一个新Job对象。除了持有jobDetail外,它还持有JobKey、jobDateMap等对象ui

  jobKeyspa

    jobDetail的标识对象,有任务名称、组名、描述等数据,组名默认为DEFAULT。线程

  jobDateMapcode

    Java.util.Map的实现,以键值对形式持有数据。这是个Map。对象

Job之JobExecutionContext

  scheduler生成的对象,持有jobDetail和trigger对象,这个对象会在调用job时做为参数被传入,所以能够在Job获取这两个对象,以及其中的key、dateMap等值,从而实现了jobDetail、trigger和job的通讯。此外,该类还持有一些其余数据,如任务上次被调用的时间,本次被调用的时间,下次被调用的时间等。blog

 

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模式构造对象。

相关文章
相关标签/搜索