問題描述
由於橫線上的方法處理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容器管理。(方法一定要從另一個類中調用,也就是從類的外部調用,類的內部調用是無效的)(如果需要從類的內部調用,需要先獲取其代理類)