SpringBoot 教程之處理異步請求

異步用法

@EnableAsync 註解

要使用 @Async,首先須要使用 @EnableAsync 註解開啓 Spring Boot 中的異步特性。html

@Configuration
@EnableAsync
public class AppConfig {
}
複製代碼

更詳細的配置說明,能夠參考:AsyncConfigurerjava

@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 不能與生命週期回調一塊兒使用,例如 @PostConstructasync

要異步初始化 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
複製代碼

引伸和引用

引伸

參考

相關文章
相關標籤/搜索