Spring整合Quartz(JobDetailBean方式)

1、Spring建立JobDetail的兩種方式

   定時任務兩種方式,Spring很好的封裝使用Quartz的細節,第一種方式是利用SPring封裝的Quartz類進行特定方法的實現,第二種是經過透明的使用Quartz達到定時任務開發的目的,整體說第二種對開發人員更方便!
html

   配置Spring的任務調度抽象層簡化了任務調度,在Quartz的基礎上提供了更好的調度對象。Spring使用Quartz框架來完成任務調度,建立Quartz的做業Bean(JobDetail),有一下兩種方法: java

   1:利用JobDetailBean包裝QuartzJobBean子類(即Job類)的實例。 web

   2:利用MethodInvokingJobDetailFactoryBean工廠Bean包裝普通的Java對象(即Job類)。 spring

   說明: 編程

      1:採用第一種方法 建立job類,必定要繼承QuartzJobBean ,實現 executeInternal(JobExecutionContext
jobexecutioncontext)方法,此方法就是被調度任務的執行體,而後將此Job類的實例直接配置到JobDetailBean中便可。這種方法和在普通的Quartz編程中是同樣的。
app

      2:採用第二種方法 建立Job類,無須繼承父類,直接配置MethodInvokingJobDetailFactoryBean便可。但須要指定一下兩個屬性:
框架

        targetObject:指定包含任務執行體的Bean實例。 this

        targetMethod:指定將指定Bean實例的該方法包裝成任務的執行體。 spa


2、整合方式一示例步驟

   一、將spring核心jar包、quartz.jar和Spring-context-support.jar導入類路徑。

     千萬不忘了導入spring-context-support-3.2.0.M2.jar:這是由於這種方式是利用SPring封裝的Quartz類進行特定方法的實現。 .net

咱們用到的兩個JobDetail:org.springframework.scheduling.quartz.JobDetailBean 和org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean ;

觸發器:org.springframework.scheduling.quartz.CronTriggerBean  ;調度器:org.springframework.scheduling.quartz.SchedulerFactoryBean 都來源於這個jar包。

   二、編寫Job類PunchJob(該類必須繼承QuartzJobBean

[java]  view plain copy
  1. package org.crazyit.hrsystem.schedule;  
  2.   
  3. import java.util.Date;  
  4. import org.springframework.scheduling.quartz.QuartzJobBean;  
  5. import org.quartz.JobExecutionContext;  
  6. import org.quartz.JobExecutionException;  
  7.   
  8. import org.crazyit.hrsystem.service.EmpManager;  
  9.   
  10. public class PunchJob  
  11.     extends QuartzJobBean   
  12. {  
  13.     //判斷做業是否執行的旗標  
  14.     private boolean isRunning = false;  
  15.     //該做業類所依賴的業務邏輯組件  
  16.     private EmpManager empMgr;  
  17.     public void setEmpMgr(EmpManager empMgr)  
  18.     {  
  19.         this.empMgr = empMgr;  
  20.     }  
  21.     //定義任務執行體  
  22.     public void executeInternal(JobExecutionContext ctx)   
  23.         throws JobExecutionException   
  24.     {  
  25.         if (!isRunning)  
  26.         {  
  27.             System.out.println("開始調度自動打卡");  
  28.             isRunning = true;  
  29.             //調用業務邏輯方法  
  30.             empMgr.autoPunch();  
  31.             isRunning = false;  
  32.         }  
  33.     }  
  34. }  

   三、編寫quartz.xml配置文件

 

[html]  view plain copy
  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!-- 指定Spring配置文件的Schema信息 -->  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:p="http://www.springframework.org/schema/p"  
  7.     xmlns:tx="http://www.springframework.org/schema/tx"  
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  9.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  10.     http://www.springframework.org/schema/tx   
  11.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  12.     http://www.springframework.org/schema/aop   
  13.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  
  14.         default-lazy-init="false">  
  15.   
  16.     <!-- 定義<span style="font-family:'courier new','courier';">一</span>個業務邏輯組件,繼承業務邏輯組件的模板 -->  
  17.     <bean id="empManager"  
  18.         class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"  
  19.         parent="managerTemplate"/>  
  20.       
  21. <!-- 定義觸發器來管理任務Bean -->  
  22. <bean id="cronTriggerPunch"   
  23.     class="org.springframework.scheduling.quartz.CronTriggerBean">  
  24.     <property name="jobDetail">  
  25.         <!-- 使用嵌套Bean的方式來定義任務Bean -->  
  26.         <bean  
  27.         class="org.springframework.scheduling.quartz.JobDetailBean">  
  28.             <!-- 指定任務Bean的實現類 -->  
  29.             <property name="jobClass"   
  30.                 value="org.crazyit.hrsystem.schedule.PunchJob"/>  
  31.             <!-- 爲任務Bean注入屬性 -->  
  32.             <property name="jobDataAsMap">  
  33.                 <map>  
  34.                     <entry key="empMgr" value-ref="empManager"/>  
  35.                 </map>  
  36.             </property>  
  37.         </bean>  
  38.     </property>  
  39.     <!-- 指定Cron表達式:週一到週五7點、12點執行調度 -->  
  40.     <property name="cronExpression"   
  41.         value="0 0 7,12 ? * MON-FRI"/>  
  42. </bean>  
  43. <!-- 執行實際的調度器-->  
  44. <bean   
  45. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  46.     <property name="triggers">  
  47.         <list>  
  48.             <ref bean="cronTriggerPunch"></ref>  
  49.         <!--    <ref local="cronTriggerPunch"/> 二者均可以用 -->  
  50.         </list>  
  51.     </property>  
  52. </bean>  
  53. </beans>  
  job data map(jobDataAsMap)可經過JobExecutionContext (執行時傳遞)獲取。JobDetailBean將 job data map的屬性映射到job的屬性。如例所示,若是job類PunchJob中包含一個empMgr屬性,JobDetailBean將自動注入到Job類PunchJob的實例中,可用於傳遞參數。若是不寫明,就會報
java.lang.NullPointerException錯誤,主要是由於沒有注入Bean。

  

  在上面的配置中咱們是讓觸發器和任務嵌套的,其實還能夠將他們分離,形如:

   <!-- 定義JobDetail的Bean -->

  <bean id="saveProjectJob"
        class="org.springframework.scheduling.quartz.JobDetailBean">

        <!-- 定義Job的Bean -->

        <property name="jobClass">
        <value>
        com.gresoft.fileupload.service.ParseFileQuartz
        </value>
        </property>

        <!-- 定義Job的Bean中引用到的其餘Bean -->

         <property name="jobDataAsMap">
          <map>
            <entry key="readXmlService">
            <ref bean="readXmlService" />
        </entry>
          </map>
        </property>
   </bean>

<!-- ----------------------------------------------------------- -->

     <!-- 定義觸發器的Bean -->

    <bean id="saveCron"
        class="org.springframework.scheduling.quartz.CronTriggerBean">

          <!-- 指定jobDetail -->

        <property name="jobDetail">

      <!--   <ref bean="saveProjectJob"></ref>二者均可以用 -->

             <ref local="saveProjectJob" />
        </property>

        <!-- 指定任務觸發的時間 -->

        <property name="cronExpression">
            <value>0/30 * * * * ?</value>
        </property>
    </bean>

  四、讓容器加載quartz.xml

  在web.xml中添加:

   <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/quartz.xml</param-value>
     </context-param>


  ###其實quartz.xml文件的內容徹底能夠寫在applicationContext.xml中的,不過那樣會顯得雜亂。

  五、配置quartz的運行環境:quartz.properties文件(放在類路徑下)

    文件名必須叫此名字,其實此文件咱們也能夠不配置的。

[html]  view plain copy
  1. # 配置主調度器屬性  
  2. org.quartz.scheduler.instanceName = QuartzScheduler  
  3. org.quartz.scheduler.instanceId  = AUTO  
  4. # 配置線程池  
  5. # Quartz線程池的實現類  
  6. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  7. # 線程池的線程數量  
  8. org.quartz.threadPool.threadCount = 1  
  9. # 線程池裏線程的優先級  
  10. org.quartz.threadPool.threadPriority = 10  
  11. # 配置做業存儲  
  12. org.quartz.jobStore.misfireThreshold = 60000  
  13. org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
   若是咱們不配置此文件的話,默認使用quartz-2.1.6.jar中的quartz.properties文件(在該壓縮文件的org/quartz路徑下),若是須要改變其運行屬性,咱們能夠本身建立一個quartz.properties文件,並將該文件放在系統加載的類路徑下,ClassLoader就會自動加載並啓用其中的各類屬性。

 3、注意事項

   在Spring配置和Quartz集成內容時,有兩點須要注意
           1、在<Beans>中不可以設置default-lazy-init="true",不然定時任務不觸發,若是不明確指明default-lazy-init的值,默認是false。
           2、在<Beans>中不可以設置default-autowire="byName"的屬性,不然後臺會報org.springframework.beans.factory.BeanCreationException錯誤,這樣就不能經過Bean名稱自動注入,必須經過明確引用注入

相關文章
相關標籤/搜索