1. 實現方式
Spring實現定時任務有兩種方式:註解方式、 XML配置方式
1) 方式一: 註解方式
配置
<!-- 包路徑掃描 -->
<context:component-scan base-package="spring.task"/>
<!-- 定義線程池 -->
<task:executor id="taskExecutor" pool-size="20" queue-capacity="100" rejection-policy="DISCARD_OLDEST"/>
<!--定義定時任務 -->
<task:scheduler id="threadPoolTaskScheduler" pool-size="10" />
<!-- 定時器開關,實際上只需要下方的一行,其中屬性均可不要 -->
<task:annotation-driven executor="taskExecutor" scheduler="threadPoolTaskScheduler"/>
測試代碼
在需要定時執行的方法上加上@Scheduled註解,並配上定時規則:
@Service
public class ScheduleTask {
private static int i=0;
/**
* 通過cron方式配置定時
*/
@Scheduled(cron = "0/5 * * * * ?")
public void loopTaskCron(){
System.out.println("loopTaskCron-------" + new Date() + "-------" + (i++) + "-------");
}
/**
* 默認毫秒級別,定期執行任務
*/
@Scheduled(fixedRate = 5 * 1000L)
public void loopTaskFixRate(){
System.out.println("loopTaskCronFixRate-------" + new Date() + "-------" + (i++) + "-------");
}
/**
* 默認毫秒級別延遲執行任務
*/
@Scheduled(fixedDelay = 5 * 1000L)
public void loopTaskFixDelay(){
System.out.println("fixedDelay-------" + new Date() + "-------" + (i++) + "-------");
}
}
2)方式二:XML配置
配置
<!-- 基於配置文件形式 -->
<bean id="myTask" class="spring.task.ScheduleTask"></bean>
<task:scheduled-tasks>
<!--這裏表示的是每隔五秒執行一次 -->
<task:scheduled ref="myTask" method="loopTaskCron" cron="*/5 * * * * ?" />
<task:scheduled ref="myTask" method="loopTaskFixRate" fixed-rate="5000" />
<task:scheduled ref="myTask" method="loopTaskFixRateString" fixed-delay="5000" />
</task:scheduled-tasks>
測試代碼
public class ScheduleTask {
private static int i=0;
/**
* 通過cron方式配置定時
*/
public void loopTaskCron(){
System.out.println("loopTaskCron-------" + new Date() + "-------" + (i++) + "-------");
}
/**
* 默認毫秒級別,定期執行任務
*/
public void loopTaskFixRate(){
System.out.println("loopTaskFixRate-------" + new Date() + "-------" + (i++) + "-------");
}
/**
* 默認毫秒級別,延遲執行任務
*/
public void loopTaskFixDelay(){
System.out.println("fixedDelay-------" + new Date() + "-------" + (i++) + "-------");
}
}
2. 定時規則
Spring支持以下幾種定時設置:
- cron : 按照cron定義方式執行任務;
- fixRate(fixRateString) : 按固定時間間隔執行任務,默認單位是毫秒,fixRateString支持字符串類型參數
- fixDelay(fixedDelayString):按一定延遲執行任務,默認單位是毫秒,fixedDelayString支持字符串類型參數
3. cron定時配置
Spring支持的cron表達式由6個 由空格分隔的時間元素,按順序依次爲:
- 秒 (0~59)
- 分鐘(0~59)
- 小時(0~23)
- 天(對應所在月的天數,0~31)
- 月(0~11)
- 天(星期, 1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
其中每個元素可以是:
- 一個值(如6)
- 一個連續區間(9-12)
- 一個間隔時間(8-18/4)(/表示每隔4小時)
- 一個列表(1,3,5)
- 通配符 “*”,表示所有可能的值
注:由於”月份中的日期”和”星期中的日期”這兩個元素互斥的,必須要對其中一個設置爲”?”.
支持的特殊字符包括:
- “*” 表示所有可能的值
- “/” 字符用來指定數值的增量,如 分鐘 裏的“0/15”表示從第0分鐘開始,每15分鐘
- “?” 字符僅被用於天(月)和天(星期)兩個子表達式,表示不指定值
- “L” 字符僅被用於天(月)和天(星期)兩個子表達式, 是“Last”的縮寫, “6L”表示這個月的倒數第6天,“FRIL”表示這個月的最一個星期五
注:“L”不要與指定列表或範圍一起使用