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模式構造對象。

相關文章
相關標籤/搜索