Spring 動態管理定時任務(使用quartz) 只是管理啟動時間 不能做啟動和暫停
阿新 • • 發佈:2019-01-08
前言:以前都沒有做記錄的習慣,發現做過的專案中用過的技術都很容易給忘了,然後要一次次的翻API一次次的查百度,浪費了大量的時間,
看到了同事和朋友用部落格的方式記錄著自己的收穫,想到自己也應該這樣做,以後就不會浪費時間做自己做過的事了。
框架:Spring4 MVC
利用的jar包:quartz
最後好不容易終於普通和動態的都整了出來,怕再給忘了,記錄下。
以下是普通的定時器:
這個XML直接定義個名字就好,到時候在applicationContext.xml中用<import resource="classpath*:/push-timer.xml"/>引入就好,我的XML檔案是
放在src/resources下的。
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <!-- ArticlePushServiceImpl這個是我的實現類-->
- <beanid="pushService"class="com.funo.cms.service.impl.ArticlePushServiceImpl"></bean>
- <!-- 定時任務 -->
- <!-- 定義呼叫物件和呼叫物件的方法 -->
- <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <!-- 呼叫的類 -->
- <
- <refbean="pushService"/>
- </property>
- <!-- 呼叫類中的方法 -->
- <propertyname="targetMethod">
- <value>autoDatePush</value>
- </property>
- </bean>
- <!-- 定義觸發時間 -->
- <beanid="doTime"class="org.springframework.scheduling.quartz.CronTriggerBean">
- <propertyname="jobDetail">
- <refbean="jobtask"/>
- </property>
- <!-- cron表示式 -->
- <propertyname="cronExpression">
- <!-- 每10秒執行一次 -->
- <value>0/10 * * * * ?</value>
- </property>
- </bean>
- <!-- 總管理類 如果將lazy-init='false'那麼容器啟動就會執行排程程式 -->
- <beanid="startQuertz"lazy-init="true"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <propertyname="triggers">
- <list>
- <refbean="doTime"/>
- </list>
- </property>
- </bean>
- </beans>
使用普通的定時器還是比較簡單的,只要配置下檔案就好了。
以下是動態定時器,這個真的不好搞哦,沒經驗,普通的搞了一個小時都搞好了,而且網上也有很多資料,動態的搞了我一整天,累死。
以下是XML程式碼
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
- default-lazy-init="true">
- <!-- 這個類用來做需要完成的業務-->
- <beanid="doAutoPush"class="com.funo.cms.web.controller.DoAutoPush"></bean>
- <!-- 定時任務 -->
- <!-- 定義呼叫物件和呼叫物件的方法,這個配置和普通的一樣的 -->
- <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <!-- 呼叫的類 -->
- <propertyname="targetObject">
- <refbean="doAutoPush"/>
- </property>
- <!-- 呼叫類中的方法 -->
- <propertyname="targetMethod">
- <value>autoPush</value>
- </property>
- <propertyname ="concurrent"value ="false"/>
- </bean>
- <!-- 定義觸發時間 ,這邊就不同了,這裡必須將時間設定成無限長,因為我們要去讀取資料庫的時間來做為定時器的觸發時間-->
- <beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
- <propertyname="jobDetail">
- <refbean="jobtask"/>
- </property>
- <!-- cron表示式 -->
- <propertyname="cronExpression">
- <!-- cron將時間設定成無限長 -->
- <value>1 0 0 1 1 ? 2099</value>
- </property>
- </bean>
- <!-- 總管理類 如果將lazy-init='false'那麼容器啟動就會執行排程程式 -->
- <beanid="startQuertz"lazy-init="true"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <propertyname="triggers">
- <list>
- <refbean="cronTrigger"/>
- </list>
- </property>
- </bean>
- <!--這個類是方法的實現類-->
- <beanid="pushService"class="com.funo.cms.service.impl.ArticlePushServiceImpl"></bean>
- <!--這裡就是這裡,就這個配置搞了我一天,這個類是用來設定觸發時間的,呼叫這個類的init的方法來進行對時間的配置-->
- <beanid="pushServiceImpl"class="com.funo.cms.web.controller.DoAutoPushServiceImpl"lazy-init="false"init-method="init">
- <!--這個物件一定要注入,這樣類才能進行管理,還有在型別要用get set方法,不然會報錯。-->
- <propertyname="scheduler"ref="startQuertz"/>
- <propertyname="pushService"ref="pushService"/>
- </bean>
- </beans>
DoAutoPush類的方法就不貼出來了,裡面什麼都沒有就一個autoPush方法用來實現業務。
以下是DoAutoPushServiceImpl程式碼:(有一定必須注意,每當重新設定新的執行時間的時候,必須呼叫這個類的init方法,這樣才能達到重新設定時間的效果)
<div style="color:green">- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.springframework.scheduling.quartz.CronTriggerBean;
- publicclass DoAutoPushServiceImpl {
- //這個是總管理類
- private Scheduler scheduler;
- //這個是我的實現方法
- private ArticlePushService pushService;
- publicvoid init(){
- try {
- CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("cronTrigger", Scheduler.DEFAULT_GROUP);
- String originConExpression = trigger.getCronExpression();
- //以上兩句程式碼我沒有用到,這個是可以獲得現在定時器排程時間,可以用來和資料庫的時間比較,如果一樣,就不用呼叫了,我省了這步
- //從資料庫獲得配置時間
- ArticlePush articlePush = pushService.queryArticlePush();
- Date date = articlePush.getPushTime();
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String strDate = format.format(date).substring(11, 19);
- //因為是要每天做一次定時任務,所以我截取了字串進行了拼接格式
- String[] strTime = strDate.split(":");
- String pushTime = strTime[2]+" "+strTime[1]+" "+strTime[0]+" * * ? ";
- //以下就是重新對時間的設定,這樣就可以達到動態設定效果。
- trigger.setCronExpression(pushTime);
- scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);
- } catch (SchedulerException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public Scheduler getScheduler() {
- return scheduler;
- }
- publicvoid setScheduler(Scheduler scheduler) {
- this.scheduler = scheduler;
- }
- public ArticlePushService getPushService() {
- return pushService;
- }
- publicvoid setPushService(ArticlePushService pushService) {
- this.pushService = pushService;
- }
- }
</div>