Spring4.1新特性——異步調度和事件機制的異常處理

目錄java

Spring4.1新特性——綜述git

Spring4.1新特性——Spring核心部分及其餘github

Spring4.1新特性——Spring緩存框架加強spring

Spring4.1新特性——異步調用和事件機制的異常處理數據庫

Spring4.1新特性——數據庫集成測試腳本初始化緩存

Spring4.1新特性——Spring MVC加強app

Spring4.1新特性——頁面自動化測試框架Spring MVC Test HtmlUnit簡介框架

Spring4.1新特性——靜態資源處理加強異步

 

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());

 

我的感受事件機制中的異常處理考慮不周。

 

 

相關文章

詳解Spring事件驅動模型

 

Spring4新特性

Spring4新特性——泛型限定式依賴注入

Spring4新特性——核心容器的其餘改進

Spring4新特性——Web開發的加強

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定義DSL

Spring4新特性——更好的Java泛型操做API 

Spring4新特性——JSR310日期API的支持

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

相關文章
相關標籤/搜索