亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot如何自定義線程池配置類

 更新時間:2024年04月02日 16:18:09   作者:ABin-阿斌  
有時候我們在項目中做一些長鏈路的跑批任務時,基于Springboot項目的定時任務,我們可以指定一個自定義的線程配置類進行單獨提供給具體跑批任務使用,而不占用整個系統(tǒng)資源,這篇文章主要介紹了SpringBoot如何自定義線程池配置類,需要的朋友可以參考下

一、前言

  • 有時候我們在項目中做一些長鏈路的跑批任務時,基于Springboot項目的定時任務,我們可以指定一個自定義的線程配置類進行單獨提供給具體跑批任務使用,而不占用整個系統(tǒng)資源。

二、案例展示

  • 我們觀察一下第一種方式和優(yōu)化后的對比在哪里,關鍵點什么?

1、初始版本

@Configuration
@EnableAsync
public class ScheduledConfig {
   /**
     * 創(chuàng)建并配置一個線程池,用于快速執(zhí)行任務。
     * 
     * @return Executor 返回一個配置好的線程池實例,可以用于快速執(zhí)行任務。
     */
    @Bean("baseExecutor")
    public Executor fastExecutor() {
        // 創(chuàng)建 ThreadPoolTaskExecutor 實例
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設置線程名前綴
        executor.setThreadNamePrefix("xxxx-schedule-baseExecutor");
        // 設置最大線程池大小
        executor.setMaxPoolSize(10);
        // 設置核心線程池大小
        executor.setCorePoolSize(8);
        // 設置隊列容量
        executor.setQueueCapacity(5);
        // 設置拒絕執(zhí)行處理器,采用CallerRunsPolicy策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

2、代碼審核意見和優(yōu)化建議

3、潛在問題和風險

  • 異常處理: 線程池的默認異常處理機制可能不足以處理所有任務拋出的異常。盡管設置了CallerRunsPolicy作為拒絕執(zhí)行處理器,它僅在線程池飽和時工作,并不直接處理任務執(zhí)行中的異常。建議增強異常處理邏輯,例如通過自定義的RejectedExecutionHandler實現(xiàn)或者在任務代碼中加入更細粒度的異常處理。
  • 資源泄露: 當應用停止時,如果線程池沒有被正確關閉,可能會導致資源泄露。雖然Spring通常會管理Bean的生命周期,但最好確認ThreadPoolTaskExecutor的實例是否加入了適當?shù)匿N毀邏輯,例如調(diào)用executor.shutdown()。
  • 線程數(shù)配置: CorePoolSize被設置為8,MaxPoolSize被設置為10,這意味著在高負載情況下,線程池只能擴展到10個線程。這樣的配置可能不足以處理所有高峰時段的請求。你需要根據(jù)實際的負載測試結(jié)果調(diào)整這些參數(shù)。
  • 隊列容量: 隊列容量被固定為5。這意味著一旦隊列滿了,即使線程池還沒有達到最大大小,任務也會被拒絕執(zhí)行。根據(jù)實際的負載情況,考慮適當增加隊列容量或調(diào)整線程池的大小。

4、優(yōu)化建議

  • 性能監(jiān)控: 考慮添加監(jiān)控機制來跟蹤線程池的性能指標,如活躍線程數(shù)、隊列大小和拒絕執(zhí)行的任務數(shù)等。這有助于及時發(fā)現(xiàn)和調(diào)整配置參數(shù),以保證系統(tǒng)的穩(wěn)定性。
  • 可調(diào)整性: 考慮將線程池的配置參數(shù)(如corePoolSize, maxPoolSize, queueCapacity等)設置為可從外部配置(例如應用配置文件)的方式獲取。這樣可以在不修改代碼的情況下調(diào)整這些參數(shù),以適應不同的運行環(huán)境。
  • 定制化: 如果有更復雜的需求,比如需要執(zhí)行周期性任務或需要更細粒度的控制任務執(zhí)行,可以考慮使用Spring提供的其他任務調(diào)度組件,如 ScheduledThreadPoolExecutor 或者集成 Quartz 等第三方庫。

5、優(yōu)化后的代碼

@Configuration
@EnableAsync
public class ExecutorConfig {
	// 名字可以根據(jù)項目業(yè)務隨意起
    @Bean("baseExecutor")
    public Executor fastExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 線程名前綴保持不變
        executor.setThreadNamePrefix("xxxx-schedule-base");
        // 調(diào)整核心線程池大小、最大線程池大小和隊列容量,以適應可能的更高負載
        executor.setCorePoolSize(16); // 增加核心線程數(shù)
        executor.setMaxPoolSize(20); // 增加最大線程數(shù)
        executor.setQueueCapacity(100); // 增加隊列容量
        // 使用自定義的RejectedExecutionHandler來處理任務被拒絕的情況
        executor.setRejectedExecutionHandler(new CustomRejectedExecutionHandler());
        // 確保在應用停止時線程池能被正確關閉
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            executor.shutdown();
        }));
        return executor;
    }
    // 自定義的拒絕執(zhí)行處理器,以更好地處理任務被拒絕的情況
    static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // 這里可以加入更詳細的日志記錄或發(fā)送警報等邏輯
            System.out.println("Task " + r.toString() + " rejected from executor " + executor.toString());
        }
    }
}

三、具體使用

@Async("baseExecutor")
@Scheduled(cron = "0 0/5 * * * ?"){
// 具體業(yè)務
}

到此這篇關于SpringBoot如何自定義線程池配置類的文章就介紹到這了,更多相關SpringBoot線程池配置類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java  Super 用法詳解及實例代碼

    java Super 用法詳解及實例代碼

    這篇文章主要介紹了java Super 用法詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • Mybatis-plus配置之日期時間自動填充實踐

    Mybatis-plus配置之日期時間自動填充實踐

    本文介紹如何使用MyBatis-Plus的MetaObjectHandler接口實現(xiàn)新增和更新時間的自動填充,通過繼承抽象類、添加注解及處理版本兼容性,簡化開發(fā)流程并減少手動操作
    2025-08-08
  • 淺析Java自定義注解的用法

    淺析Java自定義注解的用法

    注解為我們在代碼中添加信息提供一種形式化的方法,使我們可以在源碼、編譯時、運行時非常方便的使用這些數(shù)據(jù)。本文主要為大家介紹了Java自定義注解的用法,希望對大家有所幫助
    2023-03-03
  • mybatis查詢返回Map<String,Object>類型的講解

    mybatis查詢返回Map<String,Object>類型的講解

    這篇文章主要介紹了mybatis查詢返回Map<String,Object>類型的講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Logback日志存放路徑不統(tǒng)一解決方案

    Logback日志存放路徑不統(tǒng)一解決方案

    這篇文章主要介紹了Logback日志存放路徑不統(tǒng)一解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java線程池的分析和使用詳解

    Java線程池的分析和使用詳解

    本篇文章主要介紹了Java線程池的分析和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • springboot省去配置Tomcat的步驟問題

    springboot省去配置Tomcat的步驟問題

    這篇文章主要介紹了springboot省去配置Tomcat的步驟問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java實現(xiàn)簡單的酒店管理系統(tǒng)

    Java實現(xiàn)簡單的酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Java中Integer128陷阱

    Java中Integer128陷阱

    本文主要介紹了Java中Integer與int的區(qū)別及裝箱拆箱機制,重點指出-128至127范圍內(nèi)的Integer值會復用緩存對象,導致==比較結(jié)果為true,下面就來了解一下
    2025-07-07
  • SpringBoot的Security和OAuth2的使用示例小結(jié)

    SpringBoot的Security和OAuth2的使用示例小結(jié)

    這篇文章主要介紹了SpringBoot的Security和OAuth2的使用,本文通過示例圖文相結(jié)合給大家講解的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評論