当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

Spring4.1新特性——异步调度和事件机制的异常处理

发表于: 2014-08-19   作者:jinnianshilongnian   来源:转载   浏览:
摘要: 目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异常处理 Spring4.1新特性——数据库集成测试脚本初始化 Spring4.1新特性——Spring MVC增强 Spring4.1新特性——页面自动化测试框架Spring MVC T

目录

Spring4.1新特性——综述

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

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

Spring 4.1对异步调用提供了AsyncResult及SuccessCallback、FailureCallback、和异常处理的支持;对事件调度也提供了相应的异常处理器。

 

1、事件调度异常处理器

1.1、定义异常处理器:

public class MyErrorHandler implements ErrorHandler {
    @Override
    public void handleError(Throwable throwable) {
        System.out.println("事件失败了, error message : " + throwable.getMessage());
    }
}

该异常处理器的一个缺点是不知道哪个事件出错了。

 

1.2、配置异常处理器:

    <!-- 名字必须是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事件驱动模型》。

 

2、异步调度异常处理器

在异步调度中也提供了相应的异常处理器进行捕获来记录异常:

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

Spring4.1新特性——异步调度和事件机制的异常处理

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在cocos2d-x 2.x版本中,相信大家都抱怨过其中的触摸机制;在3.0版本中,采用了全新的触摸事件处理
在cocos2d-x 2.x版本中,相信大家都抱怨过其中的触摸机制;在3.0版本中,采用了全新的触摸事件处理
http://www.cnblogs.com/with-wang/archive/2012/03/24/java_doc_6.html 本文从Java异常最基本的概
1.异常的分类 The Error hierarchy describes internal errors and resource exhaustion inside the
JSP出来有HTML代码,还有JAVA脚本元素,但是JSP页面用try-catch处理异常是比较困难的,怎样处理异常
一、 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的
大多数的计算机硬件系统,具有检测某些运行时错误情况的能力,例如浮点数上溢。在许多早期的程序设
JSP出来有HTML代码,还有JAVA脚本元素,但是JSP页面用try-catch处理异常是比较困难的,怎样处理异常
(点击获取更多资料的下载) 2.1 相关概念   例外是在程序运行过程中发生的异常事件,比如除0溢出
本文从Java异常最基本的概念、语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号