spring定時任務調度

首先看一個定時任務的配置實例 <?xml version="1.0" encoding="UTF-8"?> <beans>     <!-- 掃描數據庫定時器 -->     <bean id="ScanDBQuartzJob" class="org.springframework.scheduling.quartz.JobDetailBean">         <property name="jobClass">             <value>com.sinosig.jobmanage.ScanDBQuartzJob</value>         </property>         <property name="jobDataAsMap">             <map>                 <entry key="scanDB" value-ref="scanDBService" />             </map>         </property>     </bean>     <!-- cronExpression :[秒] [分] [小時] [日] [月] [周] [年],除年外其它必須 通配符說明: * 表示全部值.         例如:在分的字段上設置 "*",表示每一分鐘都會觸發。 ? 表示不指定值。使用的場景爲不須要關心當前設置這個字段的值。例如:要在每個月的10號觸發一個操做,         但不關心是周幾,因此須要周位置的那個字段設置爲"?" 具體設置爲 0 0 0 10 * ? - 表示區間。例如 在小時上設置 "10-12",表示         10,11,12點都會觸發。 , 表示指定多個值,例如在周字段上設置 "MON,WED,FRI" 表示週一,週三和週五觸發 / 用於遞增觸發。如在秒上面設置"5/15"         表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每個月1號開始,每隔三天觸發一次。 L 表示最後的意思。在日字段設置上,表示當月的最後一天(依據當前月份,         若是是二月還會依據是不是潤年[leap]), 在周字段上表示星期六,至關於"7"或"SAT"。若是在"L"前加上數字, 則表示該數據的最後一個。例如在周字段上設置"6L"這樣的格式,則表示「本月最後一個星期五"         W 表示離指定日期的最近那個工做日(週一至週五). 例如在日字段上設置"15W", 表示離每個月15號最近的那個工做日觸發。若是15號正好是週六,則找最近的週五(14號)觸發,         若是15號是周未,則找最近的下週一(16號)觸發.若是15號正好在工做日(週一至週五), 則就在該天觸發。若是指定格式爲 "1W",它則表示每個月1號日後最近的工做日觸發。         若是1號正是週六,則將在3號下週一觸發。(注,"W"前只能設置具體的數字,不容許區間"-"). # 序號(表示每個月的第幾個周幾),例如在周字段上設置"6#3"表示在每個月的第三個週六.注意若是指定"#5",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)         ; -->     <bean id="ScanDBTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">         <property name="jobDetail">             <ref bean="ScanDBQuartzJob" />         </property>         <property name="cronExpression">             <value>0 * * * * ?</value>         </property>     </bean>     <bean id="scheduler"      class="org.springframework.scheduling.quartz.SchedulerFactoryBean">         <property name="triggers">             <list>                 <ref bean="ScanDBTrigger" />             </list>         </property>     </bean> </beans> 這份配置中,定義了一個定時任務(ScanDBQuartzJob),一個觸發器(ScanDBTrigger),一個調度器(scheduler)。調度器根據觸發器的觸發週期配置,按時執行定時任務。 若是要在代碼中增長定時任務的啓動、中止開關,以方便管理員對定時任務進行管理,能夠這樣作。 一、以調度器爲單位進行掛起、啓動 首先從spring容器中,根據調度器的id(scheduler)獲取一個org.quartz.impl.StdScheduler類的調度器。須要注意的是,雖然spring配置的調度器的類名是org.springframework.scheduling.quartz.SchedulerFactoryBean,但實際獲取的類是org.quartz.impl.StdScheduler的。當心類型轉換異常。如用這個語句: StdScheduler factory = (StdScheduler) context.getBean("scheduler"); factory能夠提供幾種調度器級別上的啓動、中止方法。包括:start(),pause(),standby(),shutdown()。 start()方法用來啓動調度,這毋庸置疑。pause()和standby()同是暫停,或者叫掛起調度,不過pause()方法已被標記爲過時,仍是用standby()吧。shutdown()是中止調度,一旦shutdown()了,就不能再用start()方法啓動調度了。 以調度器爲單位的操做會對該調度器中包含的全部定時任務起做用。若是一個調度器下的多個定時任務要求同啓同停,這樣處理倒也不錯。不過若是須要細化到對每一個定時任務進行管理,那就不能這麼幹了——除非爲每一個定時任務單獨定義一個調度器。 二、以定時任務爲單位進行管理 實際上,調度器除了start(),pause(),standby(),shutdown()方法外,還提供了一系列針對定時任務的操做,包括addJob(jobDetail, replace),deleteJob(jobName, groupName),resumeJob(jobName, groupName),pauseJob(jobName, groupName)等。 addJob(jobDetail, replace):向調度器中增長一個定時任務。第二個參數將決定若是調度器中已有這個定時任務,是否要把它替換成新的定義。可是要注意,addJob方法只增長定時任務,不會爲它指定觸發器。因此,若是隻用這個方法來添加定時任務,它是不會被調度的。 ,deleteJob(jobName, groupName):從調度器的指定定時任務組中刪除指定的定時任務。若是配置文件或代碼中都沒有指定,那麼定時任務們都在默認的定時任務組(StdScheduler.DEFAULT_GROUP)中。這個方法會將與指定定時任務相關聯的觸發器等一併刪除掉。 resumeJob(jobName, groupName):恢復指定定時任務,pauseJob(jobName, groupName):暫停指定定時任務。用這對方法,能夠實現針對一條定時任務的暫停、重啓管理操做。我就是這麼幹的。
相關文章
相關標籤/搜索