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()
直接實現(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è)置隊列容量
poolTaskExecutor.setQueueCapacity(40);
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
return poolTaskExecutor;
}然后在@Scheduled方法上標(biāo)注@Async這個注解即可實現(xiàn)多線程定時任務(wù),代碼如下:
@Async
@Scheduled(cron = "0/2 * * * * ? ")
public void test2() {
System.out.println("..................執(zhí)行test2.................");
}總結(jié)
本篇文章介紹了 Spring Boot 中實現(xiàn)多線程定時任務(wù)的三種方案,你喜歡哪一種?
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別
本文主要介紹了Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
java編程實現(xiàn)簡單的網(wǎng)絡(luò)爬蟲示例過程
這篇文章主要為大家介紹了如何使用java編程實現(xiàn)一個簡單的網(wǎng)絡(luò)爬蟲示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
springboot集成flyway自動創(chuàng)表的詳細(xì)配置
Flayway是一款數(shù)據(jù)庫版本控制管理工具,支持?jǐn)?shù)據(jù)庫版本自動升級,Migrations可以寫成sql腳本,也可以寫在java代碼里;本文通過實例代碼給大家介紹springboot集成flyway自動創(chuàng)表的詳細(xì)過程,感興趣的朋友一起看看吧2021-06-06
使用Spring Initializr創(chuàng)建Spring Boot項目沒有JDK1.8的解決辦法
很久沒創(chuàng)建springboot項目,今天使用idea的Spring Initializr 創(chuàng)建 Spring Boot項目時,發(fā)現(xiàn)java版本里,無法選擇jdk1.8,只有17、21、22,所以本文介紹了使用Spring Initializr創(chuàng)建Spring Boot項目沒有JDK1.8的解決辦法,需要的朋友可以參考下2024-06-06
java使用hadoop實現(xiàn)關(guān)聯(lián)商品統(tǒng)計
本篇文章java使用hadoop實現(xiàn)關(guān)聯(lián)商品統(tǒng)計,可以實現(xiàn)商品的關(guān)聯(lián)統(tǒng)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-10-10

