Boot中如何支持異步方法?
很高興回答你的問(wèn)題
在我們系統(tǒng)中有時(shí)候可能需要異步,也就是一個(gè)請(qǐng)求可能存在兩個(gè)或者以上的線程。
異步用法@EnableAsync 注解
要使用 @Async,首先需要使用 @EnableAsync 注解開(kāi)啟 Spring Boot 中的異步特性。
@Configuration
@EnableAsync
public class AppConfig {
}
@Async注解1. 無(wú)入?yún)o(wú)返回值方法
您可以用 @Async 注解修飾方法,這表明這個(gè)方法是異步方式調(diào)用。換句話說(shuō),程序在調(diào)用此方法時(shí)會(huì)立即返回,而方法的實(shí)際執(zhí)行發(fā)生在已提交給 Spring TaskExecutor 的任務(wù)中。在最簡(jiǎn)單的情況下,您可以將注解應(yīng)用于返回 void 的方法,如以下示例所示:
@Async
void doSomething() {
// this will be executed asynchronously
}
2. 有入?yún)o(wú)返回值方法
與使用 @Scheduled 注釋注釋的方法不同,這些方法可以指定參數(shù),因?yàn)樗鼈冊(cè)谶\(yùn)行時(shí)由調(diào)用者以“正常”方式調(diào)用,而不是由容器管理的調(diào)度任務(wù)調(diào)用。例如,以下代碼是 @Async 注解的合法應(yīng)用:
@Async
void doSomething(String s) {
// this will be executed asynchronously
}
3. 有入?yún)⒂蟹祷刂捣椒?/p>
甚至可以異步調(diào)用返回值的方法。但是,這些方法需要具有 Future 類型的返回值。這仍然提供了異步執(zhí)行的好處,以便調(diào)用者可以在調(diào)用 Future 上的 get() 之前執(zhí)行其他任務(wù)。以下示例顯示如何在返回值的方法上使用@Async:
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
管理 @Async 的異常當(dāng) @Async 方法的返回值類型為 Future 型時(shí),很容易管理在方法執(zhí)行期間拋出的異常,因?yàn)樵谡{(diào)用 get 結(jié)果時(shí)會(huì)拋出此異常。但是,對(duì)于返回值類型為 void 型的方法,異常不會(huì)被捕獲且無(wú)法傳輸。您可以提供 AsyncUncaughtExceptionHandler來(lái)處理此類異常。以下示例顯示了如何執(zhí)行此操作:
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// handle exception
}
}