springboot 并发执行定时任务
生活随笔
收集整理的這篇文章主要介紹了
springboot 并发执行定时任务
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在使用springboot框架時,其注解使用大大提升了我們的編程效率。定時任務(wù)可以通過@Scheduled注解實現(xiàn)。
但是該方法存在一個缺點:多個定時任務(wù)使用的是同一個調(diào)度線程,所以定時任務(wù)是阻塞執(zhí)行的,執(zhí)行效率不高。比如20:00的任務(wù)需要執(zhí)行2個小時,而恰好你在21:00需要執(zhí)行另一個任務(wù),那在21:00的任務(wù)會被阻塞到22:00進行,可能會導致執(zhí)行結(jié)果不是我們想要的。
通過查看springboot底層代碼:
//默認的調(diào)度器 if (this.taskScheduler == null) {this.localExecutor = Executors.newSingleThreadScheduledExecutor();this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); }//可以看到默認指定的核心線程數(shù)為1,也就是單線程 public static ScheduledExecutorService newSingleThreadScheduledExecutor() {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1)); }解決方法:通過配置類直接重新配置定時任務(wù)的調(diào)度器,增加其線程數(shù),實現(xiàn)定時任務(wù)的并發(fā)執(zhí)行。
//定時任務(wù)配置類 @Configuration public class ScheduledConfig implements SchedulingConfigurer {@Autowiredprivate TaskScheduler myThreadPoolTaskScheduler;@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {//直接暴力指定線程數(shù)//scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));//自定義線程池scheduledTaskRegistrar.setTaskScheduler(myThreadPoolTaskScheduler);}} //自定義線程池 @Component public class TaskScheduler {@Bean(name = "myThreadPoolTaskScheduler")public ThreadPoolTaskScheduler getMyThreadPoolTaskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.setThreadNamePrefix("myScheduled-");//拒絕策略 callerRunsPolicy-由調(diào)用線程處理該任務(wù)taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//調(diào)度器shutdown被調(diào)用時等待當前被調(diào)度的任務(wù)完成,用來設(shè)置線程池關(guān)閉的時候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean。同時,還設(shè)置了setAwaitTerminationSeconds(60),該方法用來設(shè)置線程池中任務(wù)的等待時間,如果超過這個時候還沒有銷毀就強制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住。taskScheduler.setWaitForTasksToCompleteOnShutdown(true);taskScheduler.setAwaitTerminationSeconds(60);return taskScheduler;}}總結(jié)
以上是生活随笔為你收集整理的springboot 并发执行定时任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 生成组织列表树(非递归)
- 下一篇: 跨源资源共享(CORS)漏洞修复