欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)我們開啟EnableAsync注解 就可以使用@Async注解來(lái)執(zhí)行異步操作了。

我們現(xiàn)在通過(guò)EnableAsync注解去打開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集成阿里云OSS上傳文件系統(tǒng)教程

    Springboot集成阿里云OSS上傳文件系統(tǒng)教程

    這篇文章主要介紹了Springboot集成阿里云OSS上傳文件系統(tǒng)教程,通過(guò)詳細(xì)的圖文展示,代碼步驟的展示和文件配置信息,希望對(duì)你有所幫助
    2021-06-06
  • SpringBoot項(xiàng)目yml配置文件不自動(dòng)提示解決方案

    SpringBoot項(xiàng)目yml配置文件不自動(dòng)提示解決方案

    這篇文章主要介紹了SpringBoot項(xiàng)目配置文件.yaml/.yml文件編寫時(shí)沒(méi)有自動(dòng)提示的解決方案,文章通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數(shù)據(jù)類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關(guān)于Java中Boolean和boolean區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Java導(dǎo)入、導(dǎo)出excel用法步驟保姆級(jí)教程(附封裝好的工具類)

    Java導(dǎo)入、導(dǎo)出excel用法步驟保姆級(jí)教程(附封裝好的工具類)

    這篇文章主要介紹了Java導(dǎo)入、導(dǎo)出excel的相關(guān)資料,講解了使用Java和ApachePOI庫(kù)將數(shù)據(jù)導(dǎo)出為Excel文件,包括創(chuàng)建工作簿、工作表、行和單元格,設(shè)置樣式和字體,合并單元格,添加公式和下拉選擇等功能,需要的朋友可以參考下
    2025-03-03
  • Mybatis查詢數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    Mybatis查詢數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    MyBatis通過(guò)XML配置文件或注解,把Java對(duì)象映射到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)現(xiàn)對(duì)象關(guān)系和數(shù)據(jù)關(guān)系的互相轉(zhuǎn)換,從而使得Java應(yīng)用程序能夠更簡(jiǎn)單的操作和讀取數(shù)據(jù)庫(kù),本文就詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java 坐標(biāo)系相互轉(zhuǎn)換方式

    Java 坐標(biāo)系相互轉(zhuǎn)換方式

    這篇文章主要介紹了Java中的坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • springboot多模塊中的共用配置文件詳解

    springboot多模塊中的共用配置文件詳解

    這篇文章主要介紹了springboot多模塊中的共用配置文件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java優(yōu)化for循環(huán)嵌套的高效率方法

    Java優(yōu)化for循環(huán)嵌套的高效率方法

    這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下
    2020-09-09
  • java序列化與反序列化的使用方法匯總

    java序列化與反序列化的使用方法匯總

    序列化是一種對(duì)象持久化的手段,普遍應(yīng)用在網(wǎng)絡(luò)傳輸、RMI等場(chǎng)景中,這篇文章主要給大家總結(jié)介紹了關(guān)于java序列化與反序列化的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Java線程Timer定時(shí)器用法詳細(xì)總結(jié)

    Java線程Timer定時(shí)器用法詳細(xì)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Java線程Timer定時(shí)器用法詳細(xì)總結(jié)內(nèi)容,需要的朋友們學(xué)習(xí)下吧。
    2020-02-02

最新評(píng)論