本人免費(fèi)整理了Java高級資料,涵蓋了Java、redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并發(fā)分布式等教程,一共30G,需要自己領(lǐng)取。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、安新網(wǎng)絡(luò)推廣、重慶小程序開發(fā)公司、安新網(wǎng)絡(luò)營銷、安新企業(yè)策劃、安新品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供安新建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
異步用法
@EnableAsync 注解
@Async 注解
明確指定執(zhí)行器
管理 @Async 的異常
@EnableAsync
?注解要使用?@Async
,首先需要使用?@EnableAsync
?注解開啟 Spring Boot 中的異步特性。
@Configuration @EnableAsync public?class?AppConfig?{ }
更詳細(xì)的配置說明,可以參考:AsyncConfigurer
@Async
?注解(1)無入?yún)o返回值方法
您可以用?@Async
?注解修飾方法,這表明這個(gè)方法是異步方式調(diào)用。換句話說,程序在調(diào)用此方法時(shí)會(huì)立即返回,而方法的實(shí)際執(zhí)行發(fā)生在已提交給 Spring?TaskExecutor
?的任務(wù)中。在最簡單的情況下,您可以將注解應(yīng)用于返回 void 的方法,如以下示例所示:
@Async void?doSomething()?{ ????//?this?will?be?executed?asynchronously }
(2)有入?yún)o返回值方法
與使用?@Scheduled
?注釋注釋的方法不同,這些方法可以指定參數(shù),因?yàn)樗鼈冊谶\(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?returnSomething(int?i)?{ ????//?this?will?be?executed?asynchronously }
@Async
?不能與生命周期回調(diào)一起使用,例如?@PostConstruct
。
要異步初始化 Spring bean,必須使用單獨(dú)的初始化 Spring bean,然后在目標(biāo)上調(diào)用?@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(); ????} }
默認(rèn)情況下,在方法上指定?@Async
?時(shí),使用的執(zhí)行器是在啟用異步支持時(shí)配置的執(zhí)行器,即如果使用 XML 或?AsyncConfigurer
?實(shí)現(xiàn)(如果有),則為“annotation-driven”元素。但是,如果需要指示在執(zhí)行給定方法時(shí)應(yīng)使用默認(rèn)值以外的執(zhí)行器,則可以使用?@Async
?注解的 value 屬性。以下示例顯示了如何執(zhí)行此操作:
@Async("otherExecutor") void?doSomething(String?s)?{ ????//?this?will?be?executed?asynchronously?by?"otherExecutor" }
在這種情況下,“otherExecutor”可以是 Spring 容器中任何 Executor bean 的名稱,也可以是與任何 Executor 關(guān)聯(lián)的限定符的名稱(例如,使用?
?元素或 Spring 的?@Qualifier
?注釋指定) )。
@Async
?的異常當(dāng)?@Async
?方法的返回值類型為?Future
?型時(shí),很容易管理在方法執(zhí)行期間拋出的異常,因?yàn)樵谡{(diào)用?get
?結(jié)果時(shí)會(huì)拋出此異常。但是,對于返回值類型為 void 型的方法,異常不會(huì)被捕獲且無法傳輸。您可以提供?AsyncUncaughtExceptionHandler
來處理此類異常。以下示例顯示了如何執(zhí)行此操作:
public?class?MyAsyncUncaughtExceptionHandler?implements?AsyncUncaughtExceptionHandler?{ ????@Override ????public?void?handleUncaughtException(Throwable?ex,?Method?method,?Object...?params)?{ ????????//?handle?exception ????} }
默認(rèn)情況下,僅記錄異常。您可以使用?AsyncConfigurer
?或?
XML元素定義自定義?AsyncUncaughtExceptionHandler
。