1. 程式人生 > >java計劃任務排程框架quartz結合spring實現排程的配置例項程式碼分享

java計劃任務排程框架quartz結合spring實現排程的配置例項程式碼分享

               

一:quartz簡介

       OpenSymphony 的Quartz提供了一個比較完美的任務排程解決方案。

       Quartz 是個開源的作業排程框架,定時排程器,為在 Java 應用程式中進行作業排程提供了簡單卻強大的機制。

       Quartz中有兩個基本概念:作業和觸發器。作業是能夠排程的可執行任務,觸發器提供了對作業的排程二:quartz spring配置詳解

  •  為什麼不適用java.util.Timer結合java.util.TimerTask 

        1.主要的原因,適用不方便,特別是制定具體的年月日時分的時間,而quartz使用類似linux上的cron配置,很方便的配置每隔時間執行觸發。        2.其次效能的原因,使用jdk自帶的Timer不具備多執行緒,而quartz採用執行緒池,效能上比timer高出很多。 

  •    詳解quartz在spring裡面的配置

    在spring裡主要分為兩種使用方式:第一種,也是目前使用最多的方式,spring提供的MethodInvokingJobDetailFactoryBean代理類,通過雷利類直接呼叫任務類的某個函式;第二種,程式裡實現quartz介面,quartz通過該介面進行排程。      主要講解通過spring提供的代理類MethodInvokingJobDetailFactoryBean        1.業務邏輯類:業務邏輯是獨立的,本身就與quartz解耦的,並沒有深入進去,這對業務來講是很好的一個方式。

public class  TestJobTask
{      /**       *業務邏輯處理       */        public void   service(){            /**業務邏輯*/                ..        }}

           2.增加一個執行緒池

[xml] view plain copy print?
  1. <!-- 執行緒執行器配置,用於任務註冊 -->
  2. <beanid="executor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  3.  <propertyname
    ="corePoolSize"value="10"/>
  4.  <propertyname="maxPoolSize"value="100"/>
  5.  <propertyname="queueCapacity"value="500"/>
  6. </bean>
<!-- 執行緒執行器配置,用於任務註冊 --><bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10" /> <property name="maxPoolSize" value="100" /> <property name="queueCapacity" value="500" /></bean>

  3.定義業務邏輯類

[xml] view plain copy print?
  1. <!-- 業務物件 -->
  2. <beanid="testJobTask"class="com.mike.scheduling.TestJobTask"/>
<!-- 業務物件 --><bean id="testJobTask" class="com.mike.scheduling.TestJobTask" />

    4.增加quartz呼叫業務邏輯 

[xml] view plain copy print?
  1. <!-- 排程業務 -->
  2. <beanid="jobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  3.  <propertyname="targetObject"ref="testJobTask"/>
  4.  <propertyname="targetMethod"value="service"/>
  5. </bean>
<!-- 排程業務 --><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="testJobTask" /> <property name="targetMethod" value="service" /></bean>

    5.增加呼叫的觸發器,觸發的時間,有兩種方式:      第一種觸發時間,採用類似linux的cron,配置時間的表示發出豐富  

[xml] view plain copy print?
  1. <beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
  2.  <propertyname="jobDetail"ref="jobDetail"/>
  3.  <propertyname="cronExpression"value="10 0/1 * * * ?"/>
  4. </bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobDetail" /> <property name="cronExpression" value="10 0/1 * * * ?" /></bean>

   Cron表示式“10 */1 * * * ?”意為:從10秒開始,每1分鐘執行一次       第二種,採用比較簡話的方式,申明延遲時間和間隔時間

[xml] view plain copy print?
  1. <beanid="taskTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  2.  <propertyname="jobDetail"ref="jobDetail"/>
  3.  <propertyname="startDelay"value="10000"/>
  4.  <propertyname="repeatInterval"value="60000"/>
  5. </bean>
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="jobDetail" /> <property name="startDelay" value="10000" /> <property name="repeatInterval" value="60000" /></bean>

   延遲10秒啟動,然後每隔1分鐘執行一次     6.開始呼叫 

[xml] view plain copy print?
  1. <!-- 設定排程 -->
  2. <beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  3.  <propertyname="triggers">
  4.   <list>
  5.    <refbean="cronTrigger"/>
  6.   </list>
  7.  </property>
  8.  <propertyname="taskExecutor"ref="executor"/>
  9. </bean>
<!-- 設定排程 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers">  <list>   <ref bean="cronTrigger" />  </list> </property> <property name="taskExecutor" ref="executor" /></bean>

   7.結束:啟動容器即可,已經將spring和quartz結合完畢。    Cron常用的表示式

"0 0 12 * * ?" 每天中午12點觸發

"0 15 10 ? * *" 每天上午10:15觸發

"0 15 10 * * ?" 每天上午10:15觸發"0 15 10 * * ? *" 每天上午10:15觸發"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發"0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發"0 15 10 15 * ?" 每月15日上午10:15觸發"0 15 10 L * ?" 每月最後一日的上午10:15觸發"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

三:quartz原理    根據上面spring的配置,我們就比較清楚quartz的內部情況,下面我們主要詳解配置涉及到的每個點    1.我們先從最後一個步驟看起, SchedulerFactoryBean ,scheduler的工廠實現,裡面可以生產出對應的多個jobDetail和trigger,每個jobDetail對應trigger代表一個任務          Quartz的SchedulerFactory是標準的工廠類,不太適合在Spring環境下使用。此外,為了保證Scheduler能夠感知 Spring容器的生命週期,完成自動啟動和關閉的操作,必須讓Scheduler和Spring容器的生命週期相關聯。以便在Spring容器啟動後, Scheduler自動開始工作,而在Spring容器關閉前,自動關閉Scheduler。為此,Spring提供 SchedulerFactoryBean,這個FactoryBean大致擁有以下的功能: 

     1)以更具Bean風格的方式為Scheduler提供配置資訊; 

     2)讓Scheduler和Spring容器的生命週期建立關聯,相生相息; 

     3)通過屬性配置部分或全部代替Quartz自身的配置檔案。 

  2.jobDetail,表示一個可執行的業務呼叫    3.trigger:排程的時間計劃,什麼時候,每隔多少時間可執行等時間計劃  4. ThreadPoolTaskExecutor,執行緒池,用來並行執行每個對應的job,提高效率,這也是上面提到不推薦使用jdk自身timer的一個很重要的原因