異步用法異步
@EnableAsync 註解ide
@Async 註解3d
明確指定執行器cdn
管理 @Async 的異常blog
異步用法生命週期
@EnableAsync 註解get
要使用 @Async,首先須要使用 @EnableAsync 註解開啓 Spring Boot 中的異步特性。it
更詳細的配置說明,能夠參考:AsyncConfigurerio
@Async 註解class
支持的用法
(1)無入參無返回值方法
您能夠用 @Async 註解修飾方法,這代表這個方法是異步方式調用。換句話說,程序在調用此方法時會當即返回,而方法的實際執行發生在已提交給 Spring TaskExecutor 的任務中。在最簡單的狀況下,您能夠將註解應用於返回 void 的方法,如如下示例所示:
(2)有入參無返回值方法
與使用 @Scheduled 註釋註釋的方法不一樣,這些方法能夠指定參數,由於它們在運行時由調用者以「正常」方式調用,而不是由容器管理的調度任務調用。例如,如下代碼是 @Async 註解的合法應用:
(3)有入參有返回值方法
甚至能夠異步調用返回值的方法。可是,這些方法須要具備 Future 類型的返回值。這仍然提供了異步執行的好處,以便調用者能夠在調用 Future 上的 get() 以前執行其餘任務。如下示例顯示如何在返回值的方法上使用@Async:
不支持的用法
@Async 不能與生命週期回調一塊兒使用,例如 @PostConstruct。
要異步初始化 Spring bean,必須使用單獨的初始化 Spring bean,而後在目標上調用 @Async帶註釋的方法,如如下示例所示:
明確指定執行器
默認狀況下,在方法上指定 @Async 時,使用的執行器是在啓用異步支持時配置的執行器,即若是使用 XML 或 AsyncConfigurer 實現(若是有),則爲「annotation-driven」元素。可是,若是須要指示在執行給定方法時應使用默認值之外的執行器,則可使用 @Async 註解的 value 屬性。如下示例顯示瞭如何執行此操做:
在這種狀況下,「otherExecutor」能夠是 Spring 容器中任何 Executor bean 的名稱,也能夠是與任何 Executor 關聯的限定符的名稱(例如,使用元素或 Spring 的 @Qualifier 註釋指定) )。
管理 @Async 的異常
當 @Async 方法的返回值類型爲 Future 型時,很容易管理在方法執行期間拋出的異常,由於在調用 get 結果時會拋出此異常。可是,對於返回值類型爲 void 型的方法,異常不會被捕獲且沒法傳輸。您能夠提供 AsyncUncaughtExceptionHandler來處理此類異常。如下示例顯示瞭如何執行此操做:
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// handle exception
}
}
默認狀況下,僅記錄異常。您可使用 AsyncConfigurer 或XML元素定義自定義 AsyncUncaughtExceptionHandler。