Spring配置文件xmlns加入
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation中加入
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"
spring掃描注解的配置
<context:component-scan base-package="com.imwoniu.*" />
任務(wù)掃描注解
<task:executor id="executor" pool-size="5" /> <task:scheduler id="scheduler" pool-size="10" /> <task:annotation-driven executor="executor" scheduler="scheduler" />
代碼實(shí)現(xiàn):
注解@Scheduled 可以作為一個(gè)觸發(fā)源添加到一個(gè)方法中氮兵,例如氯檐,以下的方法將以一個(gè)固定延遲時(shí)間5秒鐘調(diào)用一次執(zhí)行像街,這個(gè)周期是以上一個(gè)調(diào)用任務(wù)的完成時(shí)間為基準(zhǔn)咨堤,在上一個(gè)任務(wù)完成之后叹螟,5s后再次執(zhí)行:
@Scheduled(fixedDelay = 5000) public void doSomething() { // something that should execute periodically }
如果需要以固定速率執(zhí)行暂氯,只要將注解中指定的屬性名稱改成fixedRate即可,以下方法將以一個(gè)固定速率5s來調(diào)用一次執(zhí)行改淑,這個(gè)周期是以上一個(gè)任務(wù)開始時(shí)間為基準(zhǔn),從上一任務(wù)開始執(zhí)行后5s再次調(diào)用:
@Scheduled(fixedRate = 5000) public void doSomething() { // something that should execute periodically }
?
如果簡(jiǎn)單的定期調(diào)度不能滿足浴讯,那么cron表達(dá)式提供了可能
package com.imwoniu.task; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class TaskDemo { @Scheduled(cron = "0 0 2 * * ?") //每天凌晨?jī)牲c(diǎn)執(zhí)行 void doSomethingWith(){ logger.info("定時(shí)任務(wù)開始......"); long begin = System.currentTimeMillis(); //執(zhí)行數(shù)據(jù)庫操作了哦... long end = System.currentTimeMillis(); logger.info("定時(shí)任務(wù)結(jié)束朵夏,共耗時(shí):[" + (end-begin) / 1000 + "]秒"); } }
以下內(nèi)容摘自http://biaoming.iteye.com/blog/39532
一個(gè)cron表達(dá)式有至少6個(gè)(也可能7個(gè))有空格分隔的時(shí)間元素。
按順序依次為
秒(0~59)
分鐘(0~59)
小時(shí)(0~23)
天(月)(0~31榆纽,但是你需要考慮你月的天數(shù))
月(0~11)
天(星期)(1~7 1=SUN 或 SUN仰猖,MON,TUE奈籽,WED饥侵,THU,F(xiàn)RI衣屏,SAT)
7.年份(1970-2099)
其中每個(gè)元素可以是一個(gè)值(如6),一個(gè)連續(xù)區(qū)間(9-12),一個(gè)間隔時(shí)間(8-18/4)(/表示每隔4小時(shí)),一個(gè)列表(1,3,5),通配符躏升。由于"月份中的日期"和"星期中的日期"這兩個(gè)元素互斥的,必須要對(duì)其中一個(gè)設(shè)置?.
0 0 10,14,16 * * ? 每天上午10點(diǎn),下午2點(diǎn)狼忱,4點(diǎn)
0 0/30 9-17 * * ??? 朝九晚五工作時(shí)間內(nèi)每半小時(shí)
0 0 12 ? * WED 表示每個(gè)星期三中午12點(diǎn)?
"0?0?12?*?*??"?每天中午12點(diǎn)觸發(fā)?
"0?15?10???*?*"?每天上午10:15觸發(fā)?
"0?15?10?*?*??"?每天上午10:15觸發(fā)?
"0?15?10?*?*???*"?每天上午10:15觸發(fā)?
"0?15?10?*?*???2005"?2005年的每天上午10:15觸發(fā)?
"0?*?14?*?*??"?在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)?
"0?0/5?14?*?*??"?在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)?
"0?0/5?14,18?*?*??"?在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)?
"0?0-5?14?*?*??"?在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)?
"0?10,44?14???3?WED"?每年三月的星期三的下午2:10和2:44觸發(fā)?
"0?15?10???*?MON-FRI"?周一至周五的上午10:15觸發(fā)?
"0?15?10?15?*??"?每月15日上午10:15觸發(fā)?
"0?15?10?L?*??"?每月最后一日的上午10:15觸發(fā)?
"0?15?10???*?6L"?每月的最后一個(gè)星期五上午10:15觸發(fā)?
"0?15?10???*?6L?2002-2005"?2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)?
"0?15?10???*?6#3"?每月的第三個(gè)星期五上午10:15觸發(fā)?
有些子表達(dá)式能包含一些范圍或列表
例如:子表達(dá)式(天(星期))可以為 “MON-FRI”膨疏,“MON一睁,WED,F(xiàn)RI”佃却,“MON-WED,SAT”
“*”字符代表所有可能的值
因此者吁,“*”在子表達(dá)式(月)里表示每個(gè)月的含義,“*”在子表達(dá)式(天(星期))表示星期的每一天
?
“/”字符用來指定數(shù)值的增量
例如:在子表達(dá)式(分鐘)里的“0/15”表示從第0分鐘開始饲帅,每15分鐘
?????? ? 在子表達(dá)式(分鐘)里的“3/20”表示從第3分鐘開始复凳,每20分鐘(它和“3,23灶泵,43”)的含義一樣
“育八?”字符僅被用于天(月)和天(星期)兩個(gè)子表達(dá)式,表示不指定值
當(dāng)2個(gè)子表達(dá)式其中之一被指定了值以后丘逸,為了避免沖突单鹿,需要將另一個(gè)子表達(dá)式的值設(shè)為“?”
?
“L” 字符僅被用于天(月)和天(星期)兩個(gè)子表達(dá)式深纲,它是單詞“l(fā)ast”的縮寫
但是它在兩個(gè)子表達(dá)式里的含義是不同的仲锄。
在天(月)子表達(dá)式中,“L”表示一個(gè)月的最后一天
在天(星期)自表達(dá)式中湃鹊,“L”表示一個(gè)星期的最后一天儒喊,也就是SAT
如果在“L”前有具體的內(nèi)容,它就具有其他的含義了
例如:“6L”表示這個(gè)月的倒數(shù)第6天币呵,“FRIL”表示這個(gè)月的最一個(gè)星期五
注意:在使用“L”參數(shù)時(shí)怀愧,不要指定列表或范圍,因?yàn)檫@會(huì)導(dǎo)致問題
?
?
字段 ? 允許值 ? 允許的特殊字符
秒
?0-59
?, - * /
分
?0-59
?, - * /
小時(shí)
?0-23
?, - * /
日期
?1-31
?, - * ? / L W C
月份
?1-12?或者 JAN-DEC
?, - * /
星期
?1-7?或者 SUN-SAT
?, - * ? / L C #
年(可選)
?留空, 1970-2099
?, - * /