Spring Boot 中如何支援非同步方法
推薦閱讀:
非同步用法
@EnableAsync 註解
@Async 註解
明確指定執行器
管理 @Async 的異常
非同步用法
@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
不能與生命週期回撥一起使用,例如 @PostConstruct
。
要非同步初始化 Spring bean,必須使用單獨的初始化 Spring bean,然後在目標上呼叫 @Async
帶註釋的方法,如以下示例所示:
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
。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2823857/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spring boot非同步方法@Async踩坑Spring Boot非同步
- Spring Boot中如何優雅地實現非同步呼叫?Spring Boot非同步
- Spring boot應用如何支援httpsSpring BootHTTP
- Spring Boot中如何擴充套件XML請求和響應的支援Spring Boot套件XML
- Spring Boot中如何幹掉if elseSpring Boot
- 禁用 Spring Boot 中引入安全元件 spring-boot-starter-security 的方法Spring Boot元件
- spring boot(五)非同步呼叫Spring Boot非同步
- Spring Boot 支援 JSP配置Spring BootJS
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- Spring 3中非同步方法呼叫Spring非同步
- Spring Boot 非同步框架的使用Spring Boot非同步框架
- Spring Boot 新增JSP支援【轉】Spring BootJS
- 【Java面試】如何理解Spring Boot中的Starter?Java面試Spring Boot
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用Spring BootMongoDB
- Spring Boot(三):Spring Boot 中 Redis 的使用Spring BootRedis
- [非專業翻譯] Mapster - 非同步支援非同步
- Spring Boot 實現非同步事件EventSpring Boot非同步事件
- Micronaut使用提前編譯支援Spring Boot編譯Spring Boot
- Spring Boot(十二):Spring Boot 如何測試打包部署Spring Boot
- Spring Boot 配置中的敏感資訊如何保護?Spring Boot
- 如何在Spring Boot中實現整合測試?Spring Boot
- Spring Boot中如何使用Ostara監控應用?Spring Boot
- Spring Boot中7種最佳化快取方法Spring Boot快取
- Spring / Spring boot 非同步任務程式設計 WebAsyncTaskSpring Boot非同步程式設計Web
- Spring Boot @Async 非同步任務執行Spring Boot非同步
- Spring Boot如何跑起來Spring Boot
- spring boot中zookeeper使用Spring Boot
- spring boot中redis使用Spring BootRedis
- Spring Boot中Dockerfile使用Spring BootDocker
- Spring Boot專案中如何定製攔截器Spring Boot
- 如何在 Spring Boot 中為快取新增壓縮?Spring Boot快取
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- Spring Boot中JPA如何實現按日期合計Spring Boot
- 如何給女朋友解釋什麼是IO中的阻塞、非阻塞、同步、非同步?非同步
- Spring boot 非同步/定時任務/郵件Spring Boot非同步
- 如何使用Spring Boot的ProfilesSpring Boot
- 在spring boot專案(maven)中引入其他 spring boot專案Spring BootMaven
- Spring Boot學習3:web篇(中)-Spring boot Rest學習Spring BootWebREST