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

SpringBoot中使用@Async注解失效場景及說明

 更新時間:2024年07月24日 09:36:28   作者:安騰斯科技  
在Spring?Boot中,@Async注解就像一把刀,能幫你輕松處理那些耗時的任務(wù),讓主線程可以繼續(xù)忙別的事兒,不過,跟所有強大的工具一樣,用不好它也可能出岔子,為了避免這些坑,咱們得深入了解下@Async注解,接下來,咱們就來聊聊7種常見的@Async失效情況,需要的朋友可以參考下

場景一:調(diào)用者與被調(diào)用者在同一個類中

當(dāng)調(diào)用 @Async 注解的方法的類和被調(diào)用的方法在同一個類中時,@Async 注解不會生效。因為 Spring 的 AOP 代理是基于接口的,對于同一個類中的方法調(diào)用,不會經(jīng)過代理,因此 @Async 注解不會被處理。

例如:

@Service  
public class MyService {  
  
    @Async  
    public void asyncMethod() {  
        // 模擬耗時操作  
        try {  
            System.out.println("開始異步執(zhí)行");  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("Async method executed.");  
    }  
  
    public void callAsyncMethod() {  
        asyncMethod(); // 直接調(diào)用,不會異步執(zhí)行  
    }  
}

場景二:配置類未啟用異步支持

如果配置類中沒有啟用異步支持,即沒有使用 @EnableAsync 注解,那么 @Async 注解同樣不會生效。

例如:

// 沒有使用 @EnableAsync 注解,因此不會啟用異步支持  
@Configuration  
public class AsyncConfig {  
    // ... 其他配置 ...  
}  
  
@Service  
public class MyService {  
  
    @Async  
    public void asyncMethod() {  
        // 模擬耗時操作  
        try {  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("Async method executed.");  
    }  
}

場景三:方法不是 public 的

@Async 注解的方法必須是 public 的,否則不會被 Spring AOP 代理捕獲,導(dǎo)致異步執(zhí)行不生效。

例如:

@Service  
public class MyService {  
  
    @Async // 但這個方法不是 public 的,所以 @Async 不會生效  
    protected void asyncMethod() {  
        // 模擬耗時操作  
        try {  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("Async method executed.");  
    }  
  
    public void callAsyncMethod() {  
        asyncMethod(); // 直接調(diào)用,但由于 asyncMethod 不是 public 的,因此不會異步執(zhí)行  
    }  
}

場景四:線程池未正確配置

在使用 @Async 注解時,如果沒有正確配置線程池,可能會遇到異步任務(wù)沒有按預(yù)期執(zhí)行的情況。例如,線程池被配置為只有一個線程,且該線程一直被占用,那么新的異步任務(wù)就無法執(zhí)行。

例如:

@Configuration  
@EnableAsync  
public class AsyncConfig implements AsyncConfigurer {  
  
    @Override  
    public Executor getAsyncExecutor() {  
        // 創(chuàng)建一個只有一個線程的線程池,這會導(dǎo)致并發(fā)問題  
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
        executor.setCorePoolSize(1);  
        executor.setMaxPoolSize(1);  
        executor.setQueueCapacity(10);  
        executor.setThreadNamePrefix("Async-");  
        executor.initialize();  
        return executor;  
    }  
  
    // ... 其他配置 ...  
}
  
@Service  
public class MyService {  
  
    @Async  
    public void asyncMethod() {  
        // 模擬耗時操作  
        try {  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("Async method executed.");  
    }  
}

場景五:異常處理不當(dāng)

如果在異步方法中拋出了異常,并且沒有妥善處理,那么這個異??赡軙?dǎo)致任務(wù)失敗,而調(diào)用者可能無法感知到異常的發(fā)生。

例如:

@Service  
public class MyService {  
  
    @Async  
    public void asyncMethod() {  
        // 模擬一個可能會拋出異常的耗時操作  
        throw new RuntimeException("Async method exception");  
    }  
}
// 調(diào)用者  
@Service  
public class CallerService {  
  
    @Autowired  
    private MyService myService;  
  
    public void callAsyncMethod() {  
        myService.asyncMethod(); // 調(diào)用異步方法,但如果該方法拋出異常,調(diào)用者不會立即感知到  
    }  
}

場景六:Spring代理未生效

如果通過 new 關(guān)鍵字直接創(chuàng)建了服務(wù)類的實例,而不是通過 Spring 容器來獲取,那么 Spring 的 AOP 代理將不會生效,導(dǎo)致 @Async 注解無效。

例如:

@Service  
public class MyService {  
  
    @Async  
    public void asyncMethod() {  
        // 模擬耗時操作  
        try {  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("Async method executed.");  
    }  
}  
  
public class SomeNonSpringClass {  
  
    public void someMethod() {  
        MyService myService = new MyService(); // 直接通過 new 創(chuàng)建 MyService 實例,不會經(jīng)過 Spring 代理  
        myService.asyncMethod(); // 這里 @Async 不會生效  
    }  
}

場景七:使用 @Transactional 與 @Async 同時注解方法,導(dǎo)致事務(wù)失效

在同一個方法上同時使用 @Transactional 和 @Async 注解可能會導(dǎo)致問題。由于 @Async 會導(dǎo)致方法在一個新的線程中執(zhí)行,而 @Transactional 通常需要在一個由 Spring 管理的事務(wù)代理中執(zhí)行,這兩個注解的結(jié)合使用可能會導(dǎo)致事務(wù)管理失效或行為不可預(yù)測。此種場景不會導(dǎo)致@Async注解失效,但是會導(dǎo)致@Transactional注解失效,也就是事務(wù)失效。

例如:

@Service  
public class MyService {  
  
    @Autowired  
    private MyRepository myRepository;  
  
    // 錯誤的用法:同時使用了 @Transactional 和 @Async  
    @Transactional  
    @Async  
    public void asyncTransactionalMethod() {  
        // 模擬一個數(shù)據(jù)庫操作  
        myRepository.save(new MyEntity());  
          
        // 模擬可能拋出異常的代碼  
        if (true) {  
            throw new RuntimeException("Database operation failed!");  
        }  
    }  
}  
  
@Repository  
public interface MyRepository extends JpaRepository<MyEntity, Long> {  
    // ...  
}  
  
@Entity  
public class MyEntity {  
    // ... 實體類的屬性和映射 ...  
}

總結(jié)一下 :

絕大多數(shù)人會遇到的坑點主要會集中在沒有配置自定義線程池、異步方法在同一個類中調(diào)用、事務(wù)不起作用這幾個問題上。所以,萬金油的寫法還是專門定義一個AsyncService,將異步方法都寫在里面,需要使用的時候,就在其他類將其注入即可。

以上就是SpringBoot中使用@Async注解失效場景及說明的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot @Async注解失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java滾動數(shù)組計算編輯距離操作示例

    Java滾動數(shù)組計算編輯距離操作示例

    這篇文章主要介紹了Java滾動數(shù)組計算編輯距離操作,涉及java字符串與數(shù)組的遍歷、計算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Spring?Retry實現(xiàn)重試機制的示例詳解

    Spring?Retry實現(xiàn)重試機制的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring-Retry的用法以及實現(xiàn)原理是怎么樣的,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的可以了解一下
    2023-07-07
  • java web中的servlet3 upload上傳文件實踐

    java web中的servlet3 upload上傳文件實踐

    這篇文章主要介紹了servlet3 upload上傳文件實踐,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 詳解SpringCloud新一代網(wǎng)關(guān)Gateway

    詳解SpringCloud新一代網(wǎng)關(guān)Gateway

    SpringCloud Gateway是Spring Cloud的一個全新項目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式
    2021-06-06
  • Springboot整合Dubbo教程之項目創(chuàng)建和環(huán)境搭建

    Springboot整合Dubbo教程之項目創(chuàng)建和環(huán)境搭建

    本篇文章主要介紹了Springboot整合Dubbo教程之項目創(chuàng)建和環(huán)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • JSP 開發(fā)之hibernate的hql查詢多對多查詢

    JSP 開發(fā)之hibernate的hql查詢多對多查詢

    這篇文章主要介紹了JSP 開發(fā)之hibernate的hql查詢多對多查詢的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • SpringBoot項目使用@Scheduled注解實現(xiàn)定時任務(wù)的方法

    SpringBoot項目使用@Scheduled注解實現(xiàn)定時任務(wù)的方法

    文章介紹了在SpringBoot項目中使用@Scheduled注解實現(xiàn)定時任務(wù)的三種方式:基于注解、基于接口和基于注解設(shè)定多線程定時任務(wù),詳細(xì)講解了@Scheduled注解的使用方法、各個參數(shù)以及如何配置動態(tài)定時任務(wù)和多線程定時任務(wù),感興趣的朋友一起看看吧
    2025-03-03
  • SpringBoot統(tǒng)一處理功能實現(xiàn)的全過程

    SpringBoot統(tǒng)一處理功能實現(xiàn)的全過程

    最近在做項目時需要對異常進(jìn)行全局統(tǒng)一處理,主要是一些分類入庫以及記錄日志等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot統(tǒng)一功能處理實現(xiàn)的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • java字符串求并集的方法

    java字符串求并集的方法

    這篇文章主要介紹了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常實用的基本技巧,需要的朋友可以參考下
    2014-11-11
  • Java分布式學(xué)習(xí)之Kafka消息隊列

    Java分布式學(xué)習(xí)之Kafka消息隊列

    Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)
    2022-07-07

最新評論

万盛区| 铜山县| 嘉禾县| 怀集县| 玉门市| 黎平县| 平原县| 玛纳斯县| 镇赉县| 思茅市| 屏东市| 东兰县| 黄陵县| 襄垣县| 句容市| 蒙山县| 东城区| 老河口市| 玉树县| 长海县| 铜鼓县| 石阡县| 曲水县| 股票| 昆山市| 肇源县| 政和县| 化州市| 获嘉县| 咸丰县| 修武县| 乐业县| 郑州市| 蚌埠市| 井冈山市| 黎平县| 武穴市| 罗田县| 拜泉县| 遵化市| 稻城县|