在我們系統中有時候可能需要非同步,也就是一個請求可能存在兩個或者以上的執行緒。
@EnableAsync 註解
要使用 @Async,首先需要使用 @EnableAsync 註解開啟 Spring Boot 中的非同步特性。
@Configuration
@EnableAsync
public class AppConfig {
}
1. 無入參無返回值方法
您可以用 @Async 註解修飾方法,這表明這個方法是非同步方式呼叫。換句話說,程式在呼叫此方法時會立即返回,而方法的實際執行發生在已提交給 Spring TaskExecutor 的任務中。在最簡單的情況下,您可以將註解應用於返回 void 的方法,如以下示例所示:
@Async
void doSomething() {
// this will be executed asynchronously
2. 有入參無返回值方法
與使用 @Scheduled 註釋註釋的方法不同,這些方法可以指定引數,因為它們在執行時由呼叫者以“正常”方式呼叫,而不是由容器管理的排程任務呼叫。例如,以下程式碼是 @Async 註解的合法應用:
void doSomething(String s) {
3. 有入參有返回值方法
甚至可以非同步呼叫返回值的方法。但是,這些方法需要具有 Future 型別的返回值。這仍然提供了非同步執行的好處,以便呼叫者可以在呼叫 Future 上的 get() 之前執行其他任務。以下示例顯示如何在返回值的方法上使用@Async:
Future<String> returnSomething(int i) {
當 @Async 方法的返回值型別為 Future 型時,很容易管理在方法執行期間丟擲的異常,因為在呼叫 get 結果時會丟擲此異常。但是,對於返回值型別為 void 型的方法,異常不會被捕獲且無法傳輸。您可以提供 AsyncUncaughtExceptionHandler來處理此類異常。以下示例顯示瞭如何執行此操作:
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// handle exception
在我們系統中有時候可能需要非同步,也就是一個請求可能存在兩個或者以上的執行緒。
非同步用法@EnableAsync 註解
要使用 @Async,首先需要使用 @EnableAsync 註解開啟 Spring Boot 中的非同步特性。
@Configuration
@EnableAsync
public class AppConfig {
}
@Async註解1. 無入參無返回值方法
您可以用 @Async 註解修飾方法,這表明這個方法是非同步方式呼叫。換句話說,程式在呼叫此方法時會立即返回,而方法的實際執行發生在已提交給 Spring TaskExecutor 的任務中。在最簡單的情況下,您可以將註解應用於返回 void 的方法,如以下示例所示:
@Async
void doSomething() {
// this will be executed asynchronously
}
2. 有入參無返回值方法
與使用 @Scheduled 註釋註釋的方法不同,這些方法可以指定引數,因為它們在執行時由呼叫者以“正常”方式呼叫,而不是由容器管理的排程任務呼叫。例如,以下程式碼是 @Async 註解的合法應用:
@Async
void doSomething(String s) {
// this will be executed asynchronously
}
3. 有入參有返回值方法
甚至可以非同步呼叫返回值的方法。但是,這些方法需要具有 Future 型別的返回值。這仍然提供了非同步執行的好處,以便呼叫者可以在呼叫 Future 上的 get() 之前執行其他任務。以下示例顯示如何在返回值的方法上使用@Async:
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
管理 @Async 的異常當 @Async 方法的返回值型別為 Future 型時,很容易管理在方法執行期間丟擲的異常,因為在呼叫 get 結果時會丟擲此異常。但是,對於返回值型別為 void 型的方法,異常不會被捕獲且無法傳輸。您可以提供 AsyncUncaughtExceptionHandler來處理此類異常。以下示例顯示瞭如何執行此操作:
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// handle exception
}
}