日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot 并发执行定时任务

發(fā)布時間:2024/10/6 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。