每一個任務都要實現該接口。該接口只有一個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模式構造對象。