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

SpringBoot使用@Async注解可能會(huì)遇到的8大坑點(diǎn)匯總

 更新時(shí)間:2023年09月18日 10:49:27   作者:程序員濟(jì)癲  
SpringBoot中,@Async注解可以實(shí)現(xiàn)異步線程調(diào)用,用法簡(jiǎn)單,體驗(yàn)舒適,但是你一定碰到過(guò)異步調(diào)用不生效的情況,今天,我就列出90%的人都可能會(huì)遇到的8大坑點(diǎn),需要的朋友可以參考下

正文

1、未啟用異步支持

Spring Boot默認(rèn)情況下不啟用異步支持,確保在主配置類上添加@EnableAsync注解以啟用異步功能。

@SpringBootApplication
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2、沒(méi)有配置線程池

如果沒(méi)有顯式地配置線程池,Spring Boot將使用默認(rèn)的SimpleAsyncTaskExecutor實(shí)現(xiàn)。

在生產(chǎn)環(huán)境,可能導(dǎo)致性能問(wèn)題。建議使用自定義的線程池配置,推薦ThreadPoolTaskExecutor。

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10); // 設(shè)置核心線程數(shù)
        executor.setMaxPoolSize(100); // 設(shè)置最大線程數(shù)
        executor.setQueueCapacity(10); // 設(shè)置隊(duì)列容量
        executor.setThreadNamePrefix("Async-"); // 設(shè)置線程名前綴
        executor.initialize();
        return executor;
    }
    // 其他配置方法...
}

3、異步方法在同一個(gè)類調(diào)用

異步方法必須是通過(guò)代理機(jī)制來(lái)觸發(fā)的,因此如果在同一個(gè)類中調(diào)用異步方法,它將無(wú)法通過(guò)代理機(jī)制工作。

可以嘗試將異步方法移到另一個(gè)Bean中,然后通過(guò)依賴注入進(jìn)行調(diào)用,這也是萬(wàn)金油用法。

// 你的業(yè)務(wù)服務(wù)
@Service
public class MyService {
    @Autowired
    private AsyncService asyncService;
    @Async
    public void asyncMethod() {
        // 異步方法邏輯...
        asyncService.asyncMethod(); // 在另一個(gè)Bean中調(diào)用異步方法
    }
}
// 你聲明的異步服務(wù),這里面可以是你所有的異步方法,哪里調(diào)用直接注入即可。
@Service
public class AsyncService {
    @Async
    public void asyncMethod() {
        // 異步方法邏輯...
    }
}

4、事務(wù)失效問(wèn)題

@Async方法默認(rèn)不會(huì)繼承父方法的事務(wù)。如果需要事務(wù)支持,請(qǐng)確保異步方法和調(diào)用該方法的方法都被@Transactional注解標(biāo)記。

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
    @Async
    @Transactional
    public void asyncMethod() {
        // 異步方法邏輯...
        myRepository.save(entity);
    }
}

5、異常處理

異步方法中拋出的異常不能直接捕獲,因?yàn)檎{(diào)用者將無(wú)法獲取到異常。建議使用Future或CompletableFuture來(lái)捕獲異步方法的異常并進(jìn)行處理。

@Service
public class MyService {
    @Async
    public CompletableFuture<String> asyncMethod() {
        try {
            // 異步方法邏輯...
            return CompletableFuture.completedFuture("Success");
        } catch (Exception e) {
            // 處理異常...
            return CompletableFuture.failedFuture(e);
        }
    }
}
// 調(diào)用異步方法并處理異常
CompletableFuture<String> future = myService.asyncMethod();
future.exceptionally(ex -> {
    // 異常處理邏輯...
    return "Error";
});

6、異步方法無(wú)返回結(jié)果

異步方法默認(rèn)情況下是沒(méi)有返回值的,如果需要獲取異步方法的執(zhí)行結(jié)果,依然要使用Future或CompletableFuture,可以將其設(shè)置為返回類型。

@Service
public class MyService {
    @Async
    public CompletableFuture<String> asyncMethod() {
        // 異步方法邏輯...
        return CompletableFuture.completedFuture("Result");
    }
}
// 調(diào)用異步方法并獲取結(jié)果
CompletableFuture<String> future = myService.asyncMethod();
String result = future.get(); // 阻塞等待結(jié)果

當(dāng)然,正常情況下我們不需要返回結(jié)果,而且我也不建議這么干,異步線程本身也最適合處理不需要返回值的一類任務(wù)。

7、循環(huán)調(diào)用問(wèn)題

當(dāng)在同一個(gè)類中調(diào)用異步方法時(shí),注意避免出現(xiàn)無(wú)限遞歸的循環(huán)調(diào)用。這可能會(huì)導(dǎo)致應(yīng)用程序卡死或內(nèi)存溢出。

@Service
public class MyService {
    @Autowired
    private MyService myService; // 自身依賴
    @Async
    public void asyncMethod() {
        // 異步方法邏輯...
        myService.asyncMethod(); // 會(huì)導(dǎo)致無(wú)限遞歸調(diào)用
    }
}

這個(gè)坑點(diǎn)一般人不會(huì)遇到,但如果某些業(yè)務(wù)場(chǎng)景是關(guān)于樹形結(jié)構(gòu)的遍歷、圖算法等等,還是有幾率出現(xiàn)這種情況的,這個(gè)坑點(diǎn)列出來(lái)僅供學(xué)習(xí)和了解。

8、異步方法順序問(wèn)題

異步方法的執(zhí)行是非阻塞的,它們可能以任意順序完成。如果需要按照特定的順序處理結(jié)果,可以使用CompletableFuture的thenApply方法或者使用@Async的order屬性來(lái)指定順序。

@Service
public class MyService {
    @Async("threadPoolTaskExecutor")
    public CompletableFuture<String> asyncMethod1() {
        // 異步方法1邏輯...
        return CompletableFuture.completedFuture("Result1");
    }
    @Async("threadPoolTaskExecutor")
    public CompletableFuture<String> asyncMethod2() {
        // 異步方法2邏輯...
        return CompletableFuture.completedFuture("Result2");
    }
}
// 調(diào)用異步方法并處理結(jié)果順序 
CompletableFuture<String> future1 = myService.asyncMethod1(); 
CompletableFuture<String> future2 = future1.thenCompose(
                        result1 -> myService.asyncMethod2());
String finalResult = future2.get(); // 阻塞等待最終結(jié)果

總結(jié)

這里面,我個(gè)人認(rèn)為絕大多數(shù)人會(huì)遇到的坑點(diǎn)集中在沒(méi)有配置自定義線程池、異步方法在同一個(gè)類中調(diào)用、事務(wù)不起作用這幾個(gè)問(wèn)題上。

所以,萬(wàn)金油的寫法還是專門定義一個(gè)AsyncService,將異步方法都寫在里面,需要使用的時(shí)候,就在其他類將其注入即可。

以上就是SpringBoot使用@Async注解可能會(huì)遇到的8大坑點(diǎn)匯總的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot @Async注解坑點(diǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問(wèn)題

    關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問(wèn)題

    這篇文章主要介紹了Java應(yīng)用日志如何與Jaeger的trace關(guān)聯(lián),通過(guò)jaeger發(fā)現(xiàn)這十次請(qǐng)求中有一次耗時(shí)特別長(zhǎng),想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • 如何將Java打開CSV文件到JTable展示

    如何將Java打開CSV文件到JTable展示

    本文主要介紹了如何將Java打開CSV文件到JTable展示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • SpringBoot整合Security權(quán)限控制登錄首頁(yè)

    SpringBoot整合Security權(quán)限控制登錄首頁(yè)

    這篇文章主要為大家介紹了SpringBoot整合Security權(quán)限控制登錄首頁(yè)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Spring中的aware接口詳情

    Spring中的aware接口詳情

    這篇文章主要介紹了Spring中的aware接口詳情,Spring中有很多繼承于aware中的接口,這些接口到底是做什么用到的,下面我們就一起來(lái)看看吧,文章詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • 詳解maven依賴沖突以及解決方法

    詳解maven依賴沖突以及解決方法

    這篇文章主要介紹了maven依賴沖突以及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java 獲取當(dāng)前時(shí)間及實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能【推薦】

    Java 獲取當(dāng)前時(shí)間及實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能【推薦】

    這篇文章主要介紹了Java 獲取當(dāng)前時(shí)間及實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • SpringBoot整合Tomcat連接池的使用

    SpringBoot整合Tomcat連接池的使用

    這篇文章主要介紹了SpringBoot整合Tomcat連接池的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解Spring AOP的原理與實(shí)現(xiàn)方式

    詳解Spring AOP的原理與實(shí)現(xiàn)方式

    Spring框架是一個(gè)功能強(qiáng)大且靈活的企業(yè)級(jí)應(yīng)用程序開發(fā)框架,其中最重要的特性之一就是面向切面編程(AOP),我們今天這篇文章將從源碼和案例的角度詳細(xì)介紹Spring AOP的思想、原理和實(shí)現(xiàn)方式
    2023-07-07
  • Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例

    Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例

    這篇文章主要介紹了Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例,值得一提的是所謂的雙向冒泡排序并不比普通的冒泡排序效率來(lái)得高,注意相應(yīng)的時(shí)間復(fù)雜度,需要的朋友可以參考下
    2016-04-04
  • 基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    本文主要是給大家介紹 OIDC 的核心概念以及如何通過(guò)對(duì) Spring Security 的授權(quán)碼模式進(jìn)行擴(kuò)展來(lái)實(shí)現(xiàn) OIDC 的單點(diǎn)登錄。對(duì)Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)過(guò)程感興趣的朋友,一起看看吧
    2021-09-09

最新評(píng)論