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

Spring-boot 中@Async使用遇到的坑

 更新時(shí)間:2024年01月19日 08:58:58   作者:hello|world  
這篇文章主要介紹了Spring-boot 中@Async使用的坑,首先使用@Async 需要在Spring啟動(dòng)類上添加注解@EnableAsyn或者在你們線程池配置類添加@EnableAsyn,需要的朋友可以參考下

Spring的@Async使用防坑

很多人會(huì)直接只用@Async來(lái)執(zhí)行異步操作。但是這里面有一個(gè)問(wèn)題,如果都是用spring的默認(rèn)實(shí)現(xiàn),是有坑的。

當(dāng)我們開(kāi)啟EnableAsync注解 就可以使用@Async注解來(lái)執(zhí)行異步操作了。

我們現(xiàn)在通過(guò)EnableAsync注解去打開(kāi)spring異步世界的坑。

走JDK的動(dòng)態(tài)代理:

最終走到這兒來(lái)了:AnnotationAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory)

問(wèn)題就在這里,如果我們自己沒(méi)有定義Executor,也就是上面從容器beanFactory 中拿不到Executor 那么就會(huì)使用--SimpleAsyncTaskExecutor,這玩意兒實(shí)際上根本不是線程池?。。。?!

請(qǐng)看它的doExecute 方法,直接new新的線程。

所以這玩意兒一直都是在創(chuàng)建新的 線程執(zhí)行任務(wù)。。。。。

修改方式:

方案1.@Async 指定我們自己的線程池執(zhí)行:@Async("自己線程池beanName")

方案2:回到AnnotationAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory) 方法,看它如何獲取線程池的:

要么我們自己配置一個(gè)TaskExecutor, 要么我們把我自己配置的線程池的名字叫做 taskExecutor 。這個(gè)常量的值:

DEFAULT_TASK_EXECUTOR_BEAN_NAME = "taskExecutor",這樣可以避免使用SimpleAsyncTaskExecutor。

方案3:實(shí)現(xiàn)AsyncConfigurer 接口作為一個(gè)配置類交給spring管理,通過(guò)getAsyncExecutor 方法配置異步線程池。

Spring-boot 中@Async使用的坑

1、首先使用@Async 需要在Spring啟動(dòng)類上添加注解@EnableAsyn或者在你們線程池配置類添加@EnableAsyn

一下兩種選擇一種即可

@SpringBootApplication
@EnableAsync
public class SpringBootApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplicationStart.class);
    }
}
@EnableAsync
@Configuration
public class ThreadPoolConfig {
    @Bean("simpleThreadPool")
    public ThreadPoolTaskExecutor simpleThreadPool(){
        ThreadPoolTaskExecutor simpleThreadPool = new ThreadPoolTaskExecutor();
        simpleThreadPool.setCorePoolSize(5);
        simpleThreadPool.setMaxPoolSize(10);
        simpleThreadPool.setQueueCapacity(25);
        simpleThreadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        simpleThreadPool.initialize();
        return simpleThreadPool;
    }
}

注意如果自己配置了線程池那么在使用的時(shí)候需要保持一致

例如:@Async("simpleThreadPool")

2、在使用@Async的時(shí)候切記不要在一個(gè)類里面調(diào)用@Async聲明的方法,會(huì)產(chǎn)生代理繞過(guò)問(wèn)題。

@Async
    public void asyncProcess() throws InterruptedException {
        Thread.sleep(2000);
    }

3、注意寫法

@Autowired
private AsyncTaskService asyncTaskService;
public String asyncMethod(String name,int age) {
        OnelogStats.trace("msg_async", "進(jìn)入service");
        try {
             // 初學(xué)者可能會(huì)有這種錯(cuò)誤,AsyncTaskService沒(méi)有注入到Spring導(dǎo)致Async不起作用,注釋不規(guī)范
            //new AsyncTaskService().asyncProcess();
            asyncTaskService.asyncProcess();
        } catch (InterruptedException e) {
            return "async error";
        }
        return "I am " + name + ", I am " + age + " years old.";
    }

到此這篇關(guān)于Spring的@Async使用操遇到的坑的文章就介紹到這了,更多相關(guān)Spring @Async使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)插件化架構(gòu)的4種方案詳解

    SpringBoot實(shí)現(xiàn)插件化架構(gòu)的4種方案詳解

    在復(fù)雜業(yè)務(wù)場(chǎng)景下,傳統(tǒng)的單體應(yīng)用架構(gòu)往往面臨著功能擴(kuò)展困難等困難,插件化架構(gòu)作為一種模塊化設(shè)計(jì)思想的延伸,能夠使系統(tǒng)具備更好的擴(kuò)展性和靈活性,下面我們來(lái)看看SpringBoot環(huán)境下實(shí)現(xiàn)插件化架構(gòu)的4種實(shí)現(xiàn)方案吧
    2025-05-05
  • Java的Servlet及其生命周期詳解

    Java的Servlet及其生命周期詳解

    這篇文章主要介紹了Java的Servlet及其生命周期詳解,Servlet是用Java編寫的服務(wù)器端程序,一門用于開(kāi)發(fā)動(dòng)態(tài)web資源的技術(shù),其主要功能在與交互式的瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)web內(nèi)容,需要的朋友可以參考下
    2023-11-11
  • log4j2 項(xiàng)目日志組件的實(shí)例代碼

    log4j2 項(xiàng)目日志組件的實(shí)例代碼

    下面小編就為大家分享一篇log4j2 項(xiàng)目日志組件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳談Lock與synchronized 的區(qū)別

    詳談Lock與synchronized 的區(qū)別

    下面小編就為大家?guī)?lái)一篇詳談Lock與synchronized 的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • MyBatis的一級(jí)緩存和二級(jí)緩存以及優(yōu)點(diǎn)說(shuō)明

    MyBatis的一級(jí)緩存和二級(jí)緩存以及優(yōu)點(diǎn)說(shuō)明

    MyBatis的緩存機(jī)制包括一級(jí)緩存和二級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的緩存,開(kāi)啟默認(rèn),二級(jí)緩存是跨SqlSession的緩存,需要手動(dòng)開(kāi)啟和配置,二級(jí)緩存的優(yōu)點(diǎn)是減少數(shù)據(jù)庫(kù)訪問(wèn)、提高性能、降低負(fù)載和提高可擴(kuò)展性,同時(shí)需要注意緩存可能導(dǎo)致的數(shù)據(jù)不一致問(wèn)題
    2025-02-02
  • SpringBoot中循環(huán)依賴的常見(jiàn)陷阱與解決方案

    SpringBoot中循環(huán)依賴的常見(jiàn)陷阱與解決方案

    循環(huán)依賴指兩個(gè)或多個(gè)Bean相互依賴對(duì)方,形成一個(gè)閉環(huán),本文將深入探討循環(huán)依賴的根源,分析Spring的解決策略,并提供多種實(shí)戰(zhàn)解決方案,希望對(duì)大家有所幫助
    2025-05-05
  • Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象)

    Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象)

    這篇文章主要介紹了Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象),需要的朋友可以參考下
    2018-05-05
  • 鴻蒙與Java跨平臺(tái)Socket通信實(shí)戰(zhàn)代碼實(shí)例

    鴻蒙與Java跨平臺(tái)Socket通信實(shí)戰(zhàn)代碼實(shí)例

    Socket是網(wǎng)絡(luò)編程的基礎(chǔ),提供了進(jìn)程間通信的通用接口,下面這篇文章主要介紹了鴻蒙與Java跨平臺(tái)Socket通信實(shí)戰(zhàn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • java實(shí)現(xiàn)Redisson的基本使用

    java實(shí)現(xiàn)Redisson的基本使用

    Redisson是一個(gè)在Redis的基礎(chǔ)上實(shí)現(xiàn)的Java駐內(nèi)存數(shù)據(jù)網(wǎng)格客戶端,本文主要介紹了java實(shí)現(xiàn)Redisson的基本使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java字符串替換函數(shù)replace()用法解析

    Java字符串替換函數(shù)replace()用法解析

    這篇文章主要介紹了Java字符串替換函數(shù)replace()用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

通州市| 德清县| 榆中县| 宁夏| 惠东县| 定边县| 抚州市| 宕昌县| 镇江市| 上虞市| 法库县| 伽师县| 西贡区| 安岳县| 马鞍山市| 广汉市| 新密市| 阿尔山市| 安图县| 阿图什市| 丽江市| 遂溪县| 睢宁县| 叙永县| 牙克石市| 苗栗市| 桐城市| 刚察县| 东安县| 尉犁县| 彰武县| 沐川县| 垣曲县| 嘉定区| 彭阳县| 寻乌县| 五原县| 二连浩特市| 保德县| 新巴尔虎左旗| 吴川市|