SpringBoot之解決多個定時任務(wù)阻塞的問題
SpringBoot解決多個定時任務(wù)阻塞
這篇文章介紹一下Spring Boot 中如何開啟多線程定時任務(wù)?
為什么Spring Boot 定時任務(wù)是單線程的?
想要解釋為什么,一定要從源碼入手,直接從@EnableScheduling這個注解入手,找到了這個ScheduledTaskRegistrar類,其中有一段代碼如下:
protected void scheduleTasks() {
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
}如果taskScheduler為null,則創(chuàng)建單線程的線程池:Executors.newSingleThreadScheduledExecutor()。
多線程定時任務(wù)如何配置?
下面介紹三種方案配置多線程下的定時任務(wù)。
1、重寫SchedulingConfigurer#configureTasks()
直接實(shí)現(xiàn)SchedulingConfigurer這個接口,設(shè)置taskScheduler,代碼如下:
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//設(shè)定一個長度10的定時任務(wù)線程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}2、通過配置開啟
Spring Boot quartz 已經(jīng)提供了一個配置用來配置線程池的大小,如下;
spring.task.scheduling.pool.size=10
只需要在配置文件中添加如上的配置即可生效!
3、結(jié)合@Async
@Async這個注解都用過,用來開啟異步任務(wù)的,使用@Async這個注解之前一定是要先配置線程池的,配置如下:
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.setCorePoolSize(4);
poolTaskExecutor.setMaxPoolSize(6);
// 設(shè)置線程活躍時間(秒)
poolTaskExecutor.setKeepAliveSeconds(120);
// 設(shè)置隊(duì)列容量
poolTaskExecutor.setQueueCapacity(40);
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
return poolTaskExecutor;
}然后在@Scheduled方法上標(biāo)注@Async這個注解即可實(shí)現(xiàn)多線程定時任務(wù),代碼如下:
@Async
@Scheduled(cron = "0/2 * * * * ? ")
public void test2() {
System.out.println("..................執(zhí)行test2.................");
}總結(jié)
本篇文章介紹了 Spring Boot 中實(shí)現(xiàn)多線程定時任務(wù)的三種方案,你喜歡哪一種?
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis-plus無法通過logback-spring輸出日志問題及解決
本文介紹了在SpringBoot項(xiàng)目中使用Mybatis-Plus時,日志只能在控制臺輸出而無法通過logback輸出的問題及解決方法,最終選擇不使用StdOutImpl輸出日志,而是使用常規(guī)logback-spring配置來解決2026-05-05
Spring Boot2解決idea console 控制臺輸出亂碼的問題
這篇文章主要介紹了Spring Boot2解決idea console 控制臺輸出亂碼的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
jdbc實(shí)現(xiàn)圖書館借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了jdbc實(shí)現(xiàn)圖書館借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02
小議Java的源文件的聲明規(guī)則以及編程風(fēng)格
這篇文章主要介紹了小議Java的源文件的聲明規(guī)則以及編程風(fēng)格,僅給Java初學(xué)者作一個簡單的示范,需要的朋友可以參考下2015-09-09
Java實(shí)現(xiàn)常見排序算法的優(yōu)化
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java實(shí)現(xiàn)常見排序算法的優(yōu)化展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-01-01
使用Java7的Files工具類和Path接口來訪問文件的方法
下面小編就為大家分享一篇使用Java7的Files工具類和Path接口來訪問文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Java BigDecimal使用及基本運(yùn)算(推薦)
Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。這篇文章主要介紹了Java BigDecimal使用指南針(推薦),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案
這篇文章主要介紹了JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10

