最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring使用 AsyncConfigurer 自定義線程池實(shí)現(xiàn)高效異步任務(wù)管理

 更新時間:2026年02月11日 10:04:13   作者:Knight_AL  
Spring框架的@Async注解雖然提供了異步任務(wù)支持,但默認(rèn)線程池不適合生產(chǎn)環(huán)境,通過自定義線程池配置類實(shí)現(xiàn)AsyncConfigurer接口,可以統(tǒng)一管理線程池參數(shù),解決企業(yè)級應(yīng)用中線程爆炸、拒絕策略和可觀測性等問題,下面就來介紹一下如何實(shí)現(xiàn)

在現(xiàn)代企業(yè)級應(yīng)用中,異步處理任務(wù)是提升系統(tǒng)性能和響應(yīng)速度的關(guān)鍵手段之一。
Spring 框架通過 @Async 注解為我們提供了簡潔易用的異步任務(wù)支持,但在真實(shí)的業(yè)務(wù)場景中,我們往往需要更靈活、更安全的線程池配置,以確保系統(tǒng)能高效、穩(wěn)定地運(yùn)行。

一、為什么要自定義線程池?

雖然 Spring 默認(rèn)提供了一個簡單的異步執(zhí)行器(SimpleAsyncTaskExecutor),但它的設(shè)計比較基礎(chǔ),并不適合生產(chǎn)環(huán)境。
在企業(yè)級項(xiàng)目中,我們通常會遇到以下問題:

  • ? 任務(wù)執(zhí)行時間較長:需要限制線程池大小,防止線程爆炸占用過多資源;
  • ? 拒絕策略控制:當(dāng)線程池滿載時,如何優(yōu)雅地處理新任務(wù);
  • ? 可觀測性:通過自定義線程名稱前綴,更方便定位性能瓶頸和異常。

因此,自定義線程池可以讓我們:

  • 更好地控制線程數(shù)量;
  • 靈活管理任務(wù)隊列;
  • 提升調(diào)試和監(jiān)控的可維護(hù)性。

二、配置線程池

(ThreadPoolConfig.java)

要實(shí)現(xiàn)統(tǒng)一線程池管理,我們可以讓配置類實(shí)現(xiàn) AsyncConfigurer 接口,并重寫其 getAsyncExecutor() 方法,在其中返回自定義的 ThreadPoolTaskExecutor

代碼示例

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class ThreadPoolConfig implements AsyncConfigurer {

    /**
     * 創(chuàng)建一個全局統(tǒng)一的線程池
     */
    @Override
    public Executor getAsyncExecutor() {
        return taskExecutor(); // 指定全局默認(rèn)線程池
    }

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 核心線程數(shù)
        executor.setMaxPoolSize(10); // 最大線程數(shù)
        executor.setQueueCapacity(25); // 隊列容量
        executor.setThreadNamePrefix("AsyncExecutor-"); // 線程名前綴
        executor.initialize();
        return executor;
    }
}

三、創(chuàng)建異步任務(wù)服務(wù)

AsyncService.java

package com.example.demo.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {

    @Async
    public void executeAsyncTask() {
        try {
            System.out.println(Thread.currentThread().getName() + " - Task Start");
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + " - Task End");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

四、創(chuàng)建控制器觸發(fā)異步任務(wù)

AsyncController.java

package com.example.demo.controller;

import com.example.demo.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {

    @Autowired
    private AsyncService asyncService;

    @GetMapping("/start-task")
    public String startAsyncTask() {
        asyncService.executeAsyncTask();
        return "Task Started!";
    }
}

五、運(yùn)行效果

訪問 http://localhost:8080/start-task,你會看到控制臺輸出:

六、為什么企業(yè)項(xiàng)目推薦使用 implements AsyncConfigurer

1、兩種寫法的核心差別

寫法線程池綁定方式誰決定用哪個線程池
實(shí)現(xiàn) AsyncConfigurer全局綁定(統(tǒng)一入口)Spring 框架自動選擇
不實(shí)現(xiàn) AsyncConfigurer局部綁定(按名稱匹配)每個開發(fā)者自己寫 @Async("xxx")

2、問題出在哪?

小項(xiàng)目(單人開發(fā))

如果是 Demo 或簡單服務(wù),一個線程池、幾行代碼就夠了:

@Async("taskExecutor")

沒問題。

但在多人協(xié)作的大型項(xiàng)目里,這樣寫就容易出大問題??

場景一:每個模塊各自定義線程池

模塊開發(fā)者Bean 名稱
用戶模塊小李@Bean("userExecutor")
聊天模塊小王@Bean("chatExecutor")
消息模塊小陳@Bean("taskExecutor")

大家都在寫:

@Async("taskExecutor")

如果有人打錯名字,或者模塊沒被 Spring 掃描到,就會直接報錯:

No qualifying bean of type 'Executor' available: expected single matching bean but found 3

結(jié)果:應(yīng)用無法啟動,異步任務(wù)執(zhí)行失敗。

場景二:維護(hù)成本爆炸

假設(shè)項(xiàng)目有 30 多個異步任務(wù)。
某天運(yùn)維說:“把線程池從 10 改到 30。”

  • ? 沒有 AsyncConfigurer:得挨個模塊修改 Bean 配置;
  • ? 有了 AsyncConfigurer:只改一個配置類,全項(xiàng)目自動生效。

場景三:多個線程池協(xié)同使用

線程池用途
chatExecutor主業(yè)務(wù)線程池
wsExecutorWebSocket 推送
slowTaskExecutor定時任務(wù)或慢操作

如果沒人統(tǒng)一管理,可能會:

  • 有人忘記寫 @Async("xxx");
  • Spring 退回默認(rèn)線程池(SimpleAsyncTaskExecutor);
  • 結(jié)果性能崩潰,線程亂飛。

3、AsyncConfigurer的企業(yè)級優(yōu)勢

優(yōu)點(diǎn)描述
全局統(tǒng)一入口所有 @Async 方法默認(rèn)使用統(tǒng)一線程池(getAsyncExecutor() 返回的那個)。
集中維護(hù)修改線程數(shù)、拒絕策略等配置只需改一處。
兼容多線程池可定義主線程池 + 業(yè)務(wù)專用池。
避免命名沖突無需擔(dān)心 Bean 名稱重復(fù)或漏寫。
增強(qiáng)代碼規(guī)范新人接手項(xiàng)目時能一眼看懂異步執(zhí)行機(jī)制。

4、形象類比

  • ?? 不實(shí)現(xiàn) AsyncConfigurer:
    像每個開發(fā)者自己帶鍋?zhàn)鲲?,火候、油量、味道都不同。容易糊鍋?/p>

  • ? 實(shí)現(xiàn) AsyncConfigurer:
    像公司統(tǒng)一配“中央廚房”,所有菜統(tǒng)一標(biāo)準(zhǔn)、火候可控、安全可追蹤。

5、完整示例

@Configuration
@EnableAsync
public class ThreadPoolConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        return mallchatExecutor();
    }

    @Bean("chatExecutor")
    public ThreadPoolTaskExecutor mallchatExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(30);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("MallChat-");
        executor.initialize();
        return executor;
    }

    @Bean("wsExecutor")
    public ThreadPoolTaskExecutor wsExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix("WebSocket-");
        executor.initialize();
        return executor;
    }
}
@Service
public class ChatService {

    @Async // 默認(rèn)使用 chatExecutor
    public void sendMessage() {}

    @Async("wsExecutor") // 指定 WebSocket 專用線程池
    public void pushToClient() {}
}

到此這篇關(guān)于Spring使用 AsyncConfigurer 自定義線程池實(shí)現(xiàn)高效異步任務(wù)管理的文章就介紹到這了,更多相關(guān)Spring AsyncConfigurer 自定義線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中如何自定義監(jiān)聽器

    Spring中如何自定義監(jiān)聽器

    這篇文章將通過一個簡單的自定義的監(jiān)聽器,從源碼的角度分析一下Spring中監(jiān)聽的整個過程,分析監(jiān)聽的作用,感興趣的小伙伴可以了解一下
    2024-11-11
  • idea、pycharm使用后占用C盤空間,修改安裝位置的方式

    idea、pycharm使用后占用C盤空間,修改安裝位置的方式

    這篇文章主要介紹了idea、pycharm使用后占用C盤空間,修改安裝位置的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java中高效的對象映射庫Orika的用法詳解

    Java中高效的對象映射庫Orika的用法詳解

    Orika是一個高效的Java對象映射庫,專門用于在Java應(yīng)用程序中簡化對象之間的轉(zhuǎn)換,下面就跟隨小編一起來深入了解下Orika的具體使用吧
    2024-11-11
  • 詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    這篇文章主要介紹了詳解JAVA調(diào)用WCF服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java中spring boot 字符串判斷是否為空方法小結(jié)

    Java中spring boot 字符串判斷是否為空方法小結(jié)

    這篇文章主要介紹了Java中spring boot字符串判斷是否為空,通過安裝依賴,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • Java實(shí)現(xiàn)帶頭結(jié)點(diǎn)的單鏈表

    Java實(shí)現(xiàn)帶頭結(jié)點(diǎn)的單鏈表

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)帶頭結(jié)點(diǎn)的單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • springboot中的RestTemplate使用詳解

    springboot中的RestTemplate使用詳解

    這篇文章主要介紹了springboot中的RestTemplate使用詳解,RestTemplate繼承自InterceptingHttpAccessor并且實(shí)現(xiàn)了RestOperations接口,其中RestOperations接口定義了基本的RESTful操作,這些操作在RestTemplate中都得到了實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Java 實(shí)現(xiàn)簡易教務(wù)管理系統(tǒng)的代碼

    Java 實(shí)現(xiàn)簡易教務(wù)管理系統(tǒng)的代碼

    這篇文章主要介紹了Java 實(shí)現(xiàn)簡易教務(wù)管理系統(tǒng)的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 最簡單的spring boot打包docker鏡像的實(shí)現(xiàn)

    最簡單的spring boot打包docker鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了最簡單的spring boot打包docker鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java冒泡排序和選擇排序示例

    java冒泡排序和選擇排序示例

    這篇文章主要介紹了java冒泡排序和選擇排序示例,需要的朋友可以參考下
    2014-05-05

最新評論

马公市| 尉犁县| 雅江县| 新巴尔虎右旗| 志丹县| 富阳市| 清水县| 喀喇沁旗| 抚州市| 噶尔县| 本溪| 枣庄市| 黔江区| 武定县| 长宁区| 罗源县| 阿合奇县| 东阿县| 岑溪市| 泗水县| 新郑市| 洛阳市| 吐鲁番市| 大宁县| 盐边县| 孝义市| 资阳市| 内乡县| 宁都县| 盐津县| 噶尔县| 罗山县| 水城县| 朝阳区| 庆城县| 梅州市| 韩城市| 明星| 锦屏县| 宁津县| 巫山县|