使用場景:
開發中會碰到一些耗時較長或者不需要立即得到執行結果的邏輯,比如消息推送、商品同步等都可以使用異步方法,這時我們可以用到@Async。但是直接使用 @Async 會有風險,當我們沒有指定線程池時,他會默認使用其Spring自帶的 SimpleAsyncTaskExecutor 線程池,會不斷的創建線程,當併發大的時候會嚴重影響性能。所以可以將異步指定線程池使用
簡介:
@Async是Spring的註解,可以加在類或方法上。通俗的來講,如果加上了這個註解,那麼該類或者該方法在使用時將會進行異步處理,也就是創建一個線程來實現這個類或者方法,實現多線程。
線程池的執行順序:
兩種使用方式:
第一種:
使用的是Spring默認的線程池SimpleAsyncTaskExecutor。
接入步驟:
1.需要在@SpringBootApplication啓動類或者@configure註解類上 添加註解@EnableAsync啓動多線程註解。
2.在需要異步執行的方法上添加@Async註解。
默認的線程池配置:
如果需要修改默認的配置可以在yaml或者properties中添加,修改默認配置:
執行後會打印出你的執行線程名稱:
第二種:(推薦使用)
自定義線程池,執行異步。
自定義線程池有如下模式,我們只介紹最後一種:
- 重新實現接口AsyncConfigurer;
- 繼承AsyncConfigurerSupport;
- 配置由自定義的TaskExecutor替代內置的任務執行器。
然後添加註解到對應的方法上並指定線程池:asyncExecutor
指定線程池的名稱爲自定義的線程池名稱。
查看日誌:
注意事項:
查到了@Async失效的幾個原因:
- 註解@Async的方法不是public方法;
- 註解@Async的返回值只能爲void或Future;
- 註解@Async方法使用static修飾也會失效;
- 啓動類沒加@EnableAsync註解;
- 調用方和@Async不能在一個類中;
- 在Async方法上標註@Transactional是沒用的,但在Async方法調用的方法上標註@Transcational是有效的;
作者:京東零售 郭春元
來源:京東雲開發者社區 轉載請註明來源