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。
未完待续


浙公网安备 33010602011771号