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”不要与指定列表或范围一起使用