Spring boot 注解@Async不生效 無效 不起作用


問題描述

由於橫線上的方法處理6萬多條數據的update,耗時需要3 到 4 分鍾,這里加個異步處理,但是並未生效

應該是因為aop代理的緣故,被調用方法 和 調用處的代碼都處在同一個類,所以只是相當於本類調用,並沒有使用代理類 從而@Async並沒有產生效果。

 解決方案1

通過resource手動獲取Executor

    @Resource(name = "handlerDataScheduler")
    private Executor handlerDataScheduler;
    handlerDataScheduler.execute(()->{
        saveMinuteData(newMinuteData, param.getIsFirst(), cols, param);
    });

 

 解決方案2

整個方法(查詢 + update)都加上異步,這樣在外面使用spring管理的類 changeEquOperateStrategy 去調用加了異步注解的方法 dealData, 這樣就是由spring自己去控制了

 

 

 

總結

@SpringBootApplication啟動類添加@EnableAsync注解。

異步方法使用注解@Async的返回值只能為void或者Future,注解的方法必須是public方法。

@Transactional和@Async注解的實現都是基於Spring的AOP,而AOP的實現是基於動態代理模式實現的。那么注解失效的原因就很明顯了,有可能因為調用方法的是對象本身而不是代理對象,因為沒有經過Spring容器管理。(方法一定要從另一個類中調用,也就是從類的外部調用,類的內部調用是無效的)(如果需要從類的內部調用,需要先獲取其代理類)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM