@Scheduled方法加@Async遭IDE警告,如何实现单线程后台定时执行?
解决方法
为什么会出现这个警告?
Spring的@Scheduled注解本身就会把任务提交到调度线程池执行,默认情况下调度器会用后台线程处理任务,额外加@Async属于冗余用法,所以IDE会提示移除。
方案1:自定义单线程调度器(推荐)
如果需要让这个定时任务在独立的单线程执行,不需要依赖@Async,直接自定义一个单线程的TaskScheduler即可,既满足需求又消除警告:
@EnableAsync @Configuration @EnableScheduling public class DoWork { // 创建单线程的调度器 @Bean public TaskScheduler singleThreadTaskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(1); // 线程池大小设为1 scheduler.setThreadNamePrefix("single-scheduled-worker-"); // 自定义线程名,方便排查问题 scheduler.initialize(); return scheduler; } @Scheduled(cron = "xxxxxxxx") public void foo() { // 你的任务逻辑 } }
这个调度器会专门为你的定时任务分配一个独立线程,不会和其他定时任务共用线程,完全符合你“仅需额外1个线程”的要求。
方案2:保留@Async并消除警告(不推荐)
如果一定要保留@Async,可以配置一个单线程的异步执行器,同时用@SuppressWarnings注解屏蔽IDE警告:
@EnableAsync @Configuration @EnableScheduling public class DoWork { // 创建单线程的异步执行器 @Bean public Executor singleThreadAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(1); executor.setMaxPoolSize(1); executor.setThreadNamePrefix("single-async-worker-"); executor.initialize(); return executor; } // 屏蔽IDE的@Async冗余警告 @SuppressWarnings("SpringSchedulingAnnotationAsync") @Async @Scheduled(cron = "xxxxxxxx") public void foo() { // 你的任务逻辑 } }
不过这种方式属于重复利用线程池,不符合Spring调度任务的设计规范,更推荐方案1。
内容的提问来源于stack exchange,提问作者Lamming
相关产品推荐
相关产品推荐

