Spring Boot 中如何支持異步方法

  異步用法異步

  @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。

相關文章
相關標籤/搜索