1. 程式人生 > >Spring 動態管理定時任務(使用quartz) 只是管理啟動時間 不能做啟動和暫停

Spring 動態管理定時任務(使用quartz) 只是管理啟動時間 不能做啟動和暫停

前言:以前都沒有做記錄的習慣,發現做過的專案中用過的技術都很容易給忘了,然後要一次次的翻API一次次的查百度,浪費了大量的時間,

看到了同事和朋友用部落格的方式記錄著自己的收穫,想到自己也應該這樣做,以後就不會浪費時間做自己做過的事了。

框架:Spring4 MVC

利用的jar包:quartz

最後好不容易終於普通和動態的都整了出來,怕再給忘了,記錄下。

 以下是普通的定時器:

這個XML直接定義個名字就好,到時候在applicationContext.xml中用<import resource="classpath*:/push-timer.xml"/>引入就好,我的XML檔案是

放在src/resources下的。

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  5.     <!-- ArticlePushServiceImpl這個是我的實現類-->
  6.     <beanid="pushService"class="com.funo.cms.service.impl.ArticlePushServiceImpl"></bean>
  7.     <!-- 定時任務 -->
  8.     <!-- 定義呼叫物件和呼叫物件的方法  -->
  9.     <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  10.         <!-- 呼叫的類  -->
  11.         <
    propertyname="targetObject">
  12.             <refbean="pushService"/>
  13.         </property>
  14.         <!-- 呼叫類中的方法  -->
  15.         <propertyname="targetMethod">
  16.             <value>autoDatePush</value>
  17.         </property>
  18.     </bean>
  19.     <!-- 定義觸發時間  -->
  20.     <beanid="doTime"class="org.springframework.scheduling.quartz.CronTriggerBean">
  21.         <propertyname="jobDetail">
  22.             <refbean="jobtask"/>
  23.         </property>
  24.         <!-- cron表示式  -->
  25.         <propertyname="cronExpression">
  26.             <!-- 每10秒執行一次 -->
  27.             <value>0/10 * * * * ?</value>
  28.         </property>
  29.     </bean>
  30.     <!-- 總管理類 如果將lazy-init='false'那麼容器啟動就會執行排程程式  -->
  31.     <beanid="startQuertz"lazy-init="true"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  32.         <propertyname="triggers">
  33.             <list>
  34.                 <refbean="doTime"/>
  35.             </list>
  36.         </property>
  37.     </bean>
  38. </beans>

使用普通的定時器還是比較簡單的,只要配置下檔案就好了。

以下是動態定時器,這個真的不好搞哦,沒經驗,普通的搞了一個小時都搞好了,而且網上也有很多資料,動態的搞了我一整天,累死。

以下是XML程式碼

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
  5.     default-lazy-init="true">
  6.     <!-- 這個類用來做需要完成的業務-->
  7.     <beanid="doAutoPush"class="com.funo.cms.web.controller.DoAutoPush"></bean>
  8.     <!-- 定時任務 -->
  9.     <!-- 定義呼叫物件和呼叫物件的方法,這個配置和普通的一樣的 -->
  10.     <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  11.         <!-- 呼叫的類  -->
  12.         <propertyname="targetObject">
  13.             <refbean="doAutoPush"/>
  14.         </property>
  15.         <!-- 呼叫類中的方法  -->
  16.         <propertyname="targetMethod">
  17.             <value>autoPush</value>
  18.         </property>
  19.         <propertyname ="concurrent"value ="false"/>
  20.     </bean>
  21.     <!-- 定義觸發時間 ,這邊就不同了,這裡必須將時間設定成無限長,因為我們要去讀取資料庫的時間來做為定時器的觸發時間-->
  22.     <beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
  23.         <propertyname="jobDetail">
  24.             <refbean="jobtask"/>
  25.         </property>
  26.         <!-- cron表示式  -->
  27.         <propertyname="cronExpression">
  28.             <!-- cron將時間設定成無限長  -->
  29.             <value>1 0 0 1 1 ? 2099</value>
  30.         </property>
  31.     </bean>
  32.     <!-- 總管理類 如果將lazy-init='false'那麼容器啟動就會執行排程程式  -->
  33.     <beanid="startQuertz"lazy-init="true"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  34.         <propertyname="triggers">
  35.             <list>
  36.                 <refbean="cronTrigger"/>
  37.             </list>
  38.         </property>
  39.     </bean>
  40.     <!--這個類是方法的實現類-->
  41.     <beanid="pushService"class="com.funo.cms.service.impl.ArticlePushServiceImpl"></bean>
  42.           <!--這裡就是這裡,就這個配置搞了我一天,這個類是用來設定觸發時間的,呼叫這個類的init的方法來進行對時間的配置-->
  43.     <beanid="pushServiceImpl"class="com.funo.cms.web.controller.DoAutoPushServiceImpl"lazy-init="false"init-method="init">
  44.        <!--這個物件一定要注入,這樣類才能進行管理,還有在型別要用get set方法,不然會報錯。-->
  45.             <propertyname="scheduler"ref="startQuertz"/>
  46.        <propertyname="pushService"ref="pushService"/>
  47.     </bean>
  48. </beans>

DoAutoPush類的方法就不貼出來了,裡面什麼都沒有就一個autoPush方法用來實現業務。

以下是DoAutoPushServiceImpl程式碼:(有一定必須注意,每當重新設定新的執行時間的時候,必須呼叫這個類的init方法,這樣才能達到重新設定時間的效果)

<div style="color:green">
  1. import java.text.ParseException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4. import org.quartz.Scheduler;  
  5. import org.quartz.SchedulerException;  
  6. import org.springframework.scheduling.quartz.CronTriggerBean;  
  7. publicclass DoAutoPushServiceImpl {  
  8.     //這個是總管理類
  9.     private Scheduler scheduler;  
  10.     //這個是我的實現方法
  11.     private ArticlePushService pushService;  
  12.     publicvoid init(){  
  13.         try {  
  14.             CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("cronTrigger",                         Scheduler.DEFAULT_GROUP);  
  15.             String originConExpression = trigger.getCronExpression();  
  16.                  //以上兩句程式碼我沒有用到,這個是可以獲得現在定時器排程時間,可以用來和資料庫的時間比較,如果一樣,就不用呼叫了,我省了這步
  17.             //從資料庫獲得配置時間
  18.             ArticlePush articlePush =  pushService.queryArticlePush();  
  19.             Date date = articlePush.getPushTime();  
  20.             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  21.             String strDate = format.format(date).substring(1119);  
  22.             //因為是要每天做一次定時任務,所以我截取了字串進行了拼接格式
  23.                            String[] strTime = strDate.split(":");  
  24.             String pushTime =  strTime[2]+" "+strTime[1]+" "+strTime[0]+" * * ? ";  
  25.             //以下就是重新對時間的設定,這樣就可以達到動態設定效果。
  26.             trigger.setCronExpression(pushTime);  
  27.             scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);  
  28.         } catch (SchedulerException e) {  
  29.             // TODO Auto-generated catch block
  30.             e.printStackTrace();  
  31.         } catch (ParseException e) {  
  32.             // TODO Auto-generated catch block
  33.             e.printStackTrace();  
  34.         }  
  35.     }  
  36.     public Scheduler getScheduler() {  
  37.         return scheduler;  
  38.     }  
  39.     publicvoid setScheduler(Scheduler scheduler) {  
  40.         this.scheduler = scheduler;  
  41.     }  
  42.     public ArticlePushService getPushService() {  
  43.         return pushService;  
  44.     }  
  45.     publicvoid setPushService(ArticlePushService pushService) {  
  46.         this.pushService = pushService;  
  47.     }  
  48. }  

</div>