Quartz框架介紹


一、Quartz概述:

       Quartz是一個完全由Java編寫的開源任務調度的框架,通過觸發器設置作業定時運行規則,控制作業的運行時間。其中quartz集群通過故障切換和負載平衡的功能,能給調度器帶來高可用性和伸縮性。主要用來執行定時任務,如:定時發送信息、定時生成報表等等。

 

二、相關術語:

                 

 

三、Quartz的體系結構簡介:

       Quartz框架主要核心組件包括調度器、觸發器、作業。調度器作為作業的總指揮,觸發器作為作業的操作者,作業為應用的功能模塊。其關系如下圖所示:

                      

       Job為作業的接口,為任務調度的對象;JobDetail用來描述Job的實現類及其它相關的靜態信息;Trigger做為作業的定時管理工具,一個Trigger只能對應一個作業實例,而一個作業實例可對應多個觸發器;Scheduler做為定時任務容器,是quartz最上層的東西,它提攜了所有觸發器和作業,使它們協調工作,每個Scheduler都存有JobDetail和Trigger的注冊,一個Scheduler中可以注冊多個JobDetail和多個Trigger。

 

 

1、Job

      Job是一個接口,只有一個方法void execute(JobExecutionContext context),被調度的作業(類)需實現該接口中execute()方法,JobExecutionContext類提供了調度上下文的各種信息。每次執行該Job均重新創建一個Job實例,如:

 

 

[java]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. public class DDNJob implements Job{  
  2.   
  3.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  4.         perform();  
  5.     }  
  6.       
  7.     public void perform(){ //執行報表統計入口函數    
  8.         //業務邏輯    
  9.                 System.out.println("自動DDN預授權開始執行-------------執行時間:"+new Date());    
  10.         }    
  11. }  

注:DDNJob類為需要定時執行的類,execute為定時執行的方法。一個定時任務對應一個Job實現類。

 

 

2、JobDetail

Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接受一個Job的實例,相反它接收一個Job實現類,以便運行時通過newInstance()的反射機制實例化Job。因此需要通過一個類來描述Job的實現類及其它相關的靜態信息,如Job名字、描述、關聯監聽器等信息,JobDetail承擔了這一角色。JobDetail 用來保存我們作業的詳細信息。一個JobDetail可以有多個Trigger,但是一個Trigger只能對應一個JobDetail,

 

示例:

 

[java]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. 1.  JobDetail jobDetail = new JobDetail("myJob","myGroup",DDNJob.class)    
  2. 2.  說明:    
  3. 3.  myJob:job 名     
  4. 4.  myGroup:job 組(為'null'時,使用缺省的組sched.DEFAULT_GROUP)     
  5. 5.  DDNJob.class:要被執行的Java類。  

 

 

運用spring集成的MethodInvokingJobDetailFactoryBean時spring能自動生成符合quartz要去的JobDetail。
Spring中applicationContext.xml配置如下:

[html]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <!-- detail任務描述 -->   
  2.     <bean name="DDNDetail"    
  3.         class="com.mangocity.mpm.common.autoDDN.MethodInvokingJobDetailFactoryBean">    
  4.         <property name="targetObject" value="DDNJob" />  
  5.         <property name="concurrent" value="false"/>(並發執行)  
  6.         <property name="shouldRecover" value="true"/>    
  7.     </bean>    

 

3、Trigger

Trigger是一個類,描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和 CronTrigger這兩個子類。當僅需觸發一次或者以固定時間間隔周期執行,SimpleTrigger是最適合的選擇;而CronTrigger則 可以通過Cron表達式定義出各種復雜時間規則的調度方案:如每早晨9:00執行,周一、周三、周五下午5:00執行等;Spring中applicationContext.xml配置如下:

SimpleTrigger使用示例:

[html]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. // Initiate SimpleTrigger with its name and group name  
  2. SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger","triggerGroup1");  
  3. // set its start up time  
  4. simpleTrigger.setStartTime(new Date(System.currentTimeMillis()));  
  5. // set the interval, how often the job should run (10 seconds here)   
  6. simpleTrigger.setRepeatInterval(10000);  
  7. // set the number of execution of this job, set to 10 times.  
  8. simpleTrigger.setRepeatCount(10);  


通過Spring配置,jobDetail為配置的Job描述,startDelay為系統啟動執行延遲時間,repeatCount為調用次數,repeatInterval為Job觸發時間間隔。

[html]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <bean id="DDNSimpletrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  2.         <property name="jobDetail" ref="DDNDetail"/>  
  3.         <property name="startDelay" value="1"/>  
  4.         <property name="repeatCount" value="100"/>   
  5.         <property name="repeatInterval" value="1000"/>  
  6. </bean>  


CronTrigger使用示例:

[java]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. // Initiate CronTrigger with its name and group name  
  2. CronTrigger cronTrigger = new CronTrigger("cronTrigger","triggerGroup2");  
  3. try {  
  4.     // setup CronExpression  
  5.      CronExpression cexp = new CronExpression("0/5 * * * * ?");  
  6. // Assign the CronExpression to CronTrigger  
  7.      cronTrigger.setCronExpression(cexp);  
  8. catch (Exception e) {  
  9.        e.printStackTrace();  
  10. }  

 

 

通過Spring配置,jobDetail為配置的Job描述,cronExpression為Job的運行規則,具體見附錄部分內容。

[html]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <bean id="DDNCrontrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  2.         <property name="jobDetail" ref="DDNDetail"/>  
  3.         <property name="cronExpression" value="0/5 * * ? * * *"/>  
  4. </bean>      

 

4、Scheduler

        Scheduler負責管理Quartz的運行環境,Quartz它是基於多線程架構的,它啟動的時候會初始化一套線程,這套線程會用來執行一些預置的作業。Trigger和JobDetail可以注冊到Scheduler中;Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。         Scheduler擁有一個SchedulerContext,它類似於ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以訪問SchedulerContext內的信息。Scheduler使用一個線程池作為任務運行的基礎設施,任務通過共享線程池中的線程提高運行效率。 應用示例:   

[java]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
  2.     // Retrieve a scheduler from schedule factory  
  3.     Scheduler scheduler = schedulerFactory.getScheduler();  
  4.      …  
  5.     // schedule a job with JobDetail and Trigger  
  6.      scheduler.scheduleJob(jobDetail, simpleTrigger);  
  7.     // start the scheduler  
  8.     scheduler.start();  


Spring中applicationContext.xml配置:

 

 

[html]  view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <!-- 調度器  -->    
  2.     <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">   
  3.         <property name="dataSource">  
  4.             <ref bean="dataSource"/>  
  5.         </property>   
  6.         <property name="triggers">    
  7.             <list>    
  8.                 <!--  觸發器列表 -->    
  9.                 <!-- <ref bean="DDNcronTrigger" />  -->  
  10. <ref bean="DDNSimpletrigger" />  
  11.             </list>    
  12.         </property>   
  13.         <property name="configLocation" value="classpath:quartz.properties" />  
  14.     </bean>  

       其中,dataSource為數據源配置,triggers為觸發器列表配置,可以同時包含多個trigger,configLocation為quartz配置文件quartz.properties加載路徑。

 

四、總結:

       我們不只有一種兩種方法來實現我們的定時任務,就我知道的出了我們的quartz框架之外,我們spring也自己封裝有自己的定時器,再加上各種開源的插件。那我工作的公司來說,我們用windows服務來完成這個定時任務,萬變不離其宗,理解了他們的原理以及精髓,我們就可以去創新,去寫出符合自己要求的工具了!

 
好文要頂  關注我  收藏該文   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM