Spring定时任务

  Java   5分钟   368浏览   0评论

在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使用

  1. 配置类上加上@EnableScheduling注解。
  2. Bean中注解了@Scheduled的方法会被定时执行,方法必须无参无返回值。
    @EnableScheduling该注解向容器中注入了BeanPostProcessor处理Bean中添加了@Scheduled注解的方法。

默认情况下,定时任务是单线程的(线程池大小为1),以下2种方法可以设置多线程。

  1. 重写SchedulingConfigurer#configureTasks()
  2. 在配置文件中 spring.task.scheduling.pool.size=10

@Scheduled参数

  • cron表达式:网上教程很多,官方地址

  • fixedRate,fixedDelay,initialDelay

    • fixedDelay:控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。
    • fixedRate:是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。
    • initialDelay:initialDelay = 10000 表示在容器启动后,延迟10秒后再执行一次定时器。

    Cron表达式执行采用fixedDelay方式。

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论