Spring-task 定时任务

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/

使用场景

//待续

容灾策略

//待续

你可能感兴趣的:(spring,定时器,spring定时器,springtask)