SpringBoot 异步和定时任务问题

通常都知道异步需要额外配置一个线程池,不然会用一个单线程池去跑。其实定时任务也是,如果不配置线程池的话,定时任务多了也会阻塞导致后续任务一直卡住

配置异步任务线程池

@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean("asyncExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(3);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("my-async-thread-");
        executor.initialize();
        return executor;
    }
}

配置定时任务线程池

@Configuration
@EnableScheduling
public class SchedulingConfig {
    @Bean("taskScheduler")
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("My-TaskScheduler-");
        scheduler.setPoolSize(2);
        scheduler.initialize();
        return scheduler;
    }
}

配置完成后定时任务就可以通过定时任务的线程池触发

    @Scheduled(cron = "0/1 * * * * *")
    public void foo1() throws InterruptedException {
        log.info("foo1 start");
        TimeUnit.SECONDS.sleep(5);
        log.info("foo1 end");
    }

需要注意的是,定时任务也可以加上@Async注解,但是要指定线程池,不然会报线程池bean不唯一(一个定时任务线程池,一个异步任务线程池)

所以一般都是只配置一个异步线程池,然后定时任务上加上@Async。

未完待续
未完待续

posted @ 2025-07-06 23:59  一只盐桔鸡  阅读(14)  评论(0)    收藏  举报