Spring-task 定时任务
版本
spring-instrument是从spring3.0以后加入的,注意版本问题。
使用方式
1.增加标签库
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.1.xsd ">
2.开启注解
<!-- 执行线程池 -->
<task:executor id="executor" pool-size="5" />
<!-- 调度线程池 -->
<task:scheduler id="scheduler" pool-size="5" />
<!-- task扫描 -->
<task:annotation-driven executor="executor" scheduler="scheduler" />
3.@Scheduled注解使用方式
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class SpringTaskAnnotation {
@Scheduled(cron = "0/5 * * * * ?")
public void run(){
System.out.println("=======================1");
}
@Scheduled(cron = "0/5 * * * * ?")
public void run2(){
System.out.println("=======================2");
}
}
4.配置使用方式
<!-- xml方式 -->
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="springTaskXml" method="run" cron="0/5 * * * * ?" />
<task:scheduled ref="springTaskXml" method="run2" cron="0/5 * * * * ?" />
</task:scheduled-tasks>
原理介绍
spring在初始化bean后,通过“ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization”拦截到所有的用到“@Scheduled”注解的方法,并解析相应的的注解参数,放入“定时任务列表”等待后续处理;之后再“定时任务列表”中统一执行相应的定时任务(任务为顺序执行,先执行cron,之后再执行fixedRate)。
initial-delay是任务第一次被调用前的延时,单位毫秒(方法第一次调用时延迟)
fixed-delay是上一个调用完成后再次调用的延时
fixed-rate是上一个调用开始后再次调用的延时(不用等待上一次调用完成)
cron是表达式,表示在什么时候进行任务调度。
如果多个定时任务定义的是同一个时间,那么也是顺序执行的,会根据程序加载Scheduled方法的先后来执行。
但是如果某个定时任务执行未完成,此任务一直无法执行完成,无法设置下次任务执行时间,之后会导致此任务后面的所有定时任务无法继续执行,也就会出现所有的定时任务“失效”现象。
可以尽量把定时任务“分散”下。
优点
使用非常简单,配置好之后只需要在实现类上增加注解即可。避免复杂配置
spring自家产品,除spring相关的包外不需要额外引入额外jar包
支持注解和配置文件两种形式
支持线程池调度
缺点
策略配置到类中,涉及修改策略会变的比较复杂
不易管理,定时器只需要增加注解,随处可加
spring的定时任务默认是单线程,多个任务执行起来时间会有问题(B任务会因为A任务执行起来需要20S而被延后20S执行)
官方文档
http://docs.spring.io/spring/docs/3.2.9.RELEASE/javadoc-api/
使用场景
//待续
容灾策略
//待续