目錄java
Spring4.1新特性——Spring核心部分及其餘github
Spring4.1新特性——Spring緩存框架加強spring
Spring4.1新特性——異步調用和事件機制的異常處理數據庫
Spring4.1新特性——頁面自動化測試框架Spring MVC Test HtmlUnit簡介框架
Spring 4.1對異步調用提供了AsyncResult及SuccessCallback、FailureCallback、和異常處理的支持;對事件調度也提供了相應的異常處理器。async
一、事件調度異常處理器
1.一、定義異常處理器:
public class MyErrorHandler implements ErrorHandler { @Override public void handleError(Throwable throwable) { System.out.println("事件失敗了, error message : " + throwable.getMessage()); } }
該異常處理器的一個缺點是不知道哪一個事件出錯了。
1.二、配置異常處理器:
<!-- 名字必須是applicationEventMulticaster和messageSource是同樣的,默認找這個名字的對象 --> <!-- 名字必須是applicationEventMulticaster,由於AbstractApplicationContext默認找個 --> <!-- 若是找不到就new一個,但不是異步調用而是同步調用 --> <bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster"> <!-- 注入任務執行器 這樣就實現了異步調用(缺點是全局的,要麼所有異步,要麼所有同步(刪除這個屬性便是同步)) --> <property name="taskExecutor" ref="executor"/> <property name="errorHandler" ref="myErrorHandler"/> </bean> <bean id="myErrorHandler" class="com.sishuok.error.MyErrorHandler"/>
當執行的ApplicationListener中有異常時會回調該ErrorHandler,可是從目前的回調實現來看,適合作日誌記錄,其餘的無心義。本文是使用的代碼基於《詳解Spring事件驅動模型》。
二、異步調度異常處理器
在異步調度中也提供了相應的異常處理器進行捕獲來記錄異常:
public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler { @Override public void handleUncaughtException(Throwable throwable, Method method, Object... args) { System.out.println("調用異步任務出錯了, message : " + throwable.getMessage()); } }
如上異常處理器的好處比事件機制的好處在於多了出錯的位置和參數,能夠根據這些信息進行相應的處理。
配置文件:
<bean id="asyncExceptionHandler" class="com.github.zhangkaitao.spring.service.MyAsyncExceptionHandler"/> <task:annotation-driven exception-handler="asyncExceptionHandler" proxy-target-class="true" />
異步Service:
@Service @Async public class AsyncService { public void throwException() { throw new RuntimeException("error"); } public String asyncGet1() { return "123"; } //返回值必須是ListenableFuture/Future,由於是實現的問題(return ((AsyncListenableTaskExecutor) executor).submitListenable(task);) public ListenableFuture<String> asyncGet2() { return new AsyncResult<String>("123"); } }
當調用throwException時就會拋出異常並被異常處理器捕獲到。
另外在以前文章中沒有介紹異步方法的返回值,其返回值支持Future/ListenableFuture;而後調用者能夠在此等待。Spring 4.1提供了AsyncResult(實現了ListenableFuture)用於返回異步結果。
ListenableFuture提供了新的回調(SuccessCallback和FailureCallback):
ListenableFuture<String> listenableFuture = asyncService.asyncGet2(); SuccessCallback<String> successCallback = new SuccessCallback<String>() { @Override public void onSuccess(String str) { System.out.println("異步回調成功了, return : " + str); } }; FailureCallback failureCallback = new FailureCallback() { @Override public void onFailure(Throwable throwable) { System.out.println("異步回調失敗了, exception message : " + throwable.getMessage()); } }; listenableFuture.addCallback(successCallback, failureCallback); Assert.assertEquals("123", listenableFuture.get());
我的感受事件機制中的異常處理考慮不周。
相關文章
Spring4新特性
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——註解、腳本、任務、MVC等其餘特性改進
源碼下載
https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-event
https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-async