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

SpringBoot使用@Async注解可能會遇到的8大坑點匯總

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

正文

1、未啟用異步支持

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

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

2、沒有配置線程池

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

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

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

3、異步方法在同一個類調用

異步方法必須是通過代理機制來觸發(fā)的,因此如果在同一個類中調用異步方法,它將無法通過代理機制工作。

可以嘗試將異步方法移到另一個Bean中,然后通過依賴注入進行調用,這也是萬金油用法。

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

4、事務失效問題

@Async方法默認不會繼承父方法的事務。如果需要事務支持,請確保異步方法和調用該方法的方法都被@Transactional注解標記。

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

5、異常處理

異步方法中拋出的異常不能直接捕獲,因為調用者將無法獲取到異常。建議使用Future或CompletableFuture來捕獲異步方法的異常并進行處理。

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

6、異步方法無返回結果

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

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

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

7、循環(huán)調用問題

當在同一個類中調用異步方法時,注意避免出現(xiàn)無限遞歸的循環(huán)調用。這可能會導致應用程序卡死或內存溢出。

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

這個坑點一般人不會遇到,但如果某些業(yè)務場景是關于樹形結構的遍歷、圖算法等等,還是有幾率出現(xiàn)這種情況的,這個坑點列出來僅供學習和了解。

8、異步方法順序問題

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

@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");
    }
}
// 調用異步方法并處理結果順序 
CompletableFuture<String> future1 = myService.asyncMethod1(); 
CompletableFuture<String> future2 = future1.thenCompose(
                        result1 -> myService.asyncMethod2());
String finalResult = future2.get(); // 阻塞等待最終結果

總結

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

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

以上就是SpringBoot使用@Async注解可能會遇到的8大坑點匯總的詳細內容,更多關于SpringBoot @Async注解坑點的資料請關注腳本之家其它相關文章!

相關文章

  • 快速排序算法在Java中的實現(xiàn)

    快速排序算法在Java中的實現(xiàn)

    這篇文章主要介紹了快速排序算法在Java中的實現(xiàn),簡單介紹了快速排序的實現(xiàn)原理,分享了兩種實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • jdk7 中HashMap的知識點總結

    jdk7 中HashMap的知識點總結

    HashMap的原理是老生常談了,不作仔細解說。一句話概括為HashMap是一個散列表,它存儲的內容是鍵值對(key-value)映射。這篇文章主要總結了關于jdk7 中HashMap的知識點,需要的朋友可以參考借鑒,一起來看看吧。
    2017-01-01
  • java中maven下載和安裝步驟說明

    java中maven下載和安裝步驟說明

    在本篇文章里小編給大家分享的是一篇關于java中maven下載和安裝步驟說明內容,對此有興趣的朋友們可以學習參考下。
    2021-02-02
  • Java工程mybatis實現(xiàn)多表查詢過程詳解

    Java工程mybatis實現(xiàn)多表查詢過程詳解

    這篇文章主要介紹了Java工程mybatis實現(xiàn)多表查詢過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java中public class與class的區(qū)別詳解

    java中public class與class的區(qū)別詳解

    以下是對java中public class與class的區(qū)別進行了分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • Spring中@Scope注解用法解析

    Spring中@Scope注解用法解析

    這篇文章主要介紹了Spring中@Scope注解用法解析,@Scope注解主要作用是調節(jié)Ioc容器中的作用域,在Spring IoC容器中主要有以下五種作用域,需要的朋友可以參考下
    2023-11-11
  • 分布式面試分布式鎖實現(xiàn)及應用場景

    分布式面試分布式鎖實現(xiàn)及應用場景

    這篇文章主要為大家介紹了關于分布式的面試問題,分布式鎖的實現(xiàn)及應用不同場景下的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java中RedisUtils工具類的使用

    Java中RedisUtils工具類的使用

    本文主要介紹了Java中RedisUtils工具類的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java圖片壓縮三種高效壓縮方案詳細解析

    Java圖片壓縮三種高效壓縮方案詳細解析

    圖片壓縮通常涉及減少圖片的尺寸縮放、調整圖片的質量(針對JPEG、PNG等)、使用特定的算法來減少圖片的數(shù)據量等,這篇文章主要介紹了Java圖片壓縮三種高效壓縮方案的相關資料,需要的朋友可以參考下
    2025-04-04
  • Java BigDecimal使用方法詳解

    Java BigDecimal使用方法詳解

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。雙精度浮點型變量double可以處理16位有效數(shù),但在實際應用中,可能需要對更大或者更小的數(shù)進行運算和處理
    2022-12-12

最新評論

刚察县| 乐至县| 迁安市| 黄陵县| 东至县| 绥中县| 富阳市| 安庆市| 广宗县| 铁力市| 财经| 南通市| 镶黄旗| 藁城市| 庄浪县| 郴州市| 河北省| 平邑县| 福建省| 犍为县| 陵川县| 福贡县| 鸡泽县| 丰都县| SHOW| 汪清县| 合川市| 凤山市| 奉化市| 武陟县| 洛阳市| 阳东县| 郁南县| 叙永县| 习水县| 普宁市| 高州市| 资兴市| 壤塘县| 赫章县| 湖北省|