@EnableAsync
註解要使用 @Async
,首先須要使用 @EnableAsync
註解開啓 Spring Boot 中的異步特性。html
@Configuration
@EnableAsync
public class AppConfig {
}
複製代碼
更詳細的配置說明,能夠參考:AsyncConfigurer
java
@Async
註解(1)無入參無返回值方法git
您能夠用 @Async
註解修飾方法,這代表這個方法是異步方式調用。換句話說,程序在調用此方法時會當即返回,而方法的實際執行發生在已提交給 Spring TaskExecutor
的任務中。在最簡單的狀況下,您能夠將註解應用於返回 void 的方法,如如下示例所示:github
@Async
void doSomething() {
// this will be executed asynchronously
}
複製代碼
(2)有入參無返回值方法spring
與使用 @Scheduled
註釋註釋的方法不一樣,這些方法能夠指定參數,由於它們在運行時由調用者以「正常」方式調用,而不是由容器管理的調度任務調用。例如,如下代碼是 @Async
註解的合法應用:api
@Async
void doSomething(String s) {
// this will be executed asynchronously
}
複製代碼
(3)有入參有返回值方法bash
甚至能夠異步調用返回值的方法。可是,這些方法須要具備 Future
類型的返回值。這仍然提供了異步執行的好處,以便調用者能夠在調用 Future
上的 get()
以前執行其餘任務。如下示例顯示如何在返回值的方法上使用@Async
:異步
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
複製代碼
@Async
不能與生命週期回調一塊兒使用,例如 @PostConstruct
。async
要異步初始化 Spring bean,必須使用單獨的初始化 Spring bean,而後在目標上調用 @Async
帶註釋的方法,如如下示例所示:ide
public class SampleBeanImpl implements SampleBean {
@Async
void doSomething() {
// ...
}
}
public class SampleBeanInitializer {
private final SampleBean bean;
public SampleBeanInitializer(SampleBean bean) {
this.bean = bean;
}
@PostConstruct
public void initialize() {
bean.doSomething();
}
}
複製代碼
默認狀況下,在方法上指定 @Async
時,使用的執行器是在啓用異步支持時配置的執行器,即若是使用 XML 或 AsyncConfigurer
實現(若是有),則爲「annotation-driven」元素。可是,若是須要指示在執行給定方法時應使用默認值之外的執行器,則可使用 @Async
註解的 value 屬性。如下示例顯示瞭如何執行此操做:
@Async("otherExecutor")
void doSomething(String s) {
// this will be executed asynchronously by "otherExecutor"
}
複製代碼
在這種狀況下,「otherExecutor」能夠是 Spring 容器中任何 Executor bean 的名稱,也能夠是與任何 Executor 關聯的限定符的名稱(例如,使用 <qualifier>
元素或 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
或 <task:annotation-driven />
XML元素定義自定義 AsyncUncaughtExceptionHandler
。
完整示例:源碼
使用方法:
mvn clean package
cd target
java -jar sbe-core-asyn.jar
複製代碼
引伸
參考