Spring定时任务
在Spring项目中,可以非常方便地集成定时任务。定时任务功能属于Spring Integration模块。
定时任务官方文档地址
SpringTask
Spring定时任务的两个核心接口是TaskExecutor和TaskScheduler。
- TaskExecutor继承自JDK的Executor,但其实Executor一模一样,只有一个execute方法,参数为Runnable对象。
@FunctionalInterface
public interface TaskExecutor extends Executor {
@Override
void execute(Runnable task);
}
- TaskScheduler调度不同的定时任务,Spring默认有多个默认实现,通常情况下我们不需要自己实现。
public interface TaskScheduler {
ScheduledFuture schedule(Runnable task, Trigger trigger);
ScheduledFuture schedule(Runnable task, Instant startTime);
ScheduledFuture scheduleAtFixedRate(Runnable task, Date startTime, long period);
...
}
TaskExecutor实现
- SyncTaskExecutor:同步单线程,直接在当前线程中执行任务,即在execute方法中直接调用Runnable的run方法。
- SimpleAsyncTaskExecutor:多线程,每个任务启动一个新线程,可以设置并发限制,超出限制会阻塞任务执行,释放线程后执行。
- ConcurrentTaskExecutor:适配JDK的Executor,如果默认的Executor不满足使用,很少使用到。
- ThreadPoolTaskExecutor:线程池的实现,最常用。
- WorkManagerTaskExecutor:集成CommonJ。
- DefaultManagedTaskExecutor:JNDI。
最后两个具体可以查看官方文档和相关资料。
TaskScheduler实现
- ConcurrentTaskScheduler:适配java.util.concurrent.ScheduledExecutorService。
- DefaultManagedTaskScheduler:JNDI。
- ThreadPoolTaskScheduler:线程池,基本使用该Scheduler。
SpringTask使用
- 配置类上加上@EnableScheduling注解。
- Bean中注解了@Scheduled的方法会被定时执行,方法必须无参无返回值。
@EnableScheduling该注解向容器中注入了BeanPostProcessor处理Bean中添加了@Scheduled注解的方法。
默认情况下,定时任务是单线程的(线程池大小为1),以下2种方法可以设置多线程。
- 重写SchedulingConfigurer#configureTasks()
- 在配置文件中 spring.task.scheduling.pool.size=10
@Scheduled参数
-
cron表达式:网上教程很多,官方地址
-
fixedRate,fixedDelay,initialDelay
- fixedDelay:控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。
- fixedRate:是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。
- initialDelay:initialDelay = 10000 表示在容器启动后,延迟10秒后再执行一次定时器。
Cron表达式执行采用fixedDelay方式。
Q.E.D.