Springboot 定时任务 @Scheduled 和异步任务 @Async 相关配置以及使用

定时任务

  1. 使用前在使用的类或springboot application启动类上加注解 @EnableScheduling 开启使用定时任务。
  2. 在对应的方法上加注解 @Scheduled 使用该方法进行定时任务。
  3. @Scheduled有三种形式的使用方式,分别对应不同入参
    (1)cron:按照表达式执行任务,在表达式设置的时间点时若执行的任务线程堵塞了则该时间点不会执行任务。
    (2)fixedDelay(或fixedDelayString):固定延迟间隔执行任务,上一轮任务执行完毕后按照该设置的间隔固定周期再次执行任务。
    (3)fixedRate(或fixedRateString):固定频率执行任务,线程阻塞时后面的任务则会进行排队。

异步任务

  1. 使用前在使用的类或springboot application启动类上加注解 @EnableAsync 开启使用异步任务。
  2. 在对应的方法上加注解 @Async 使用该方法进行定时任务。

定时以及异步任务一起使用

@Scheduled开启的定时任务在线程阻塞时,会影响后面任务的执行,当@Scheduled和@Async一起使用时,能开启多线程异步执行,但此时使用的是默认的SimpleAsyncTaskExecutor,若要一起使用,建议使用自定义的线程池。

在异步注解加上value值,声明使用自己的线程池配置,如:@Async("CustomThreadPool")
若不声明,则默认使用的是taskExecutor,应用启动时回去寻找是否有taskExecutor的bean,没有则会使用默认的SimpleAsyncTaskExecutor。

线程池配置:

@Configuration
public class TaskSchedulerConfig {

    //  @Bean的value值对应@Async的value值,若@Async不声明,则此处@Bean可声明为taskExecutor
    @Bean("CustomThreadPool")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        //  设置自己所需的线程池大小
        taskScheduler.setPoolSize(20);
        return taskScheduler;
    }
}

参考:Springboot定时任务@Scheduled,异步任务@Async