`
jinnianshilongnian
  • 浏览: 21433840 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404932
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997590
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631404
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257542
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593136
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248958
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847466
Group-logo
跟我学Nginx+Lua开...
浏览量:698110
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780420
社区版块
存档分类
最新评论

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

阅读更多

目录

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

5
0
分享到:
评论
9 楼 Long_yuan 2017-06-01  
supercwg 写道
supercwg 写道
jinnianshilongnian 写道
supercwg 写道
涛ge,还是要向你请教个shiro的问题,我是将shiro集成redis的,跑的是tomcat,我真搞不清楚shiro的session和tomcat的session是什么关系?或者说如何理解两者的关系和差别?现在还要集成redis,shiro也可以实现cache将shiro session存到redis,那tomcat的session呢?我真被这个session搞晕了,求帮忙解决啊~~~

shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。


哦,谢谢涛ge指点,我再仔细看看源码先

涛ge,另外还想请教个问题,就是我要实现个通用日志记录用户操作,直接在DAO层调用SecurityUtils.getSubject().getPrincipal()获取当前用户是否会存在问题

分布式...
8 楼 vancant小坏 2015-01-22  
目前还没用到,不过看了写的挺好的 就关注了。希望以后能一起交流。像你学习
7 楼 jinnianshilongnian 2015-01-20  
飞天奔月 写道
关于 1、事件调度异常处理器

这部分内容, spring 很久以前 就支持了吧 , 这个不是spring4.1的新特性吧?

我是对着源码找的,不会错的。 可以看下javadoc
6 楼 飞天奔月 2015-01-19  
关于 1、事件调度异常处理器

这部分内容, spring 很久以前 就支持了吧 , 这个不是spring4.1的新特性吧?
5 楼 Melody19 2014-11-17  
楼主咱耐你啊!
4 楼 supercwg 2014-08-19  
supercwg 写道
jinnianshilongnian 写道
supercwg 写道
涛ge,还是要向你请教个shiro的问题,我是将shiro集成redis的,跑的是tomcat,我真搞不清楚shiro的session和tomcat的session是什么关系?或者说如何理解两者的关系和差别?现在还要集成redis,shiro也可以实现cache将shiro session存到redis,那tomcat的session呢?我真被这个session搞晕了,求帮忙解决啊~~~

shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。


哦,谢谢涛ge指点,我再仔细看看源码先

涛ge,另外还想请教个问题,就是我要实现个通用日志记录用户操作,直接在DAO层调用SecurityUtils.getSubject().getPrincipal()获取当前用户是否会存在问题
3 楼 supercwg 2014-08-19  
jinnianshilongnian 写道
supercwg 写道
涛ge,还是要向你请教个shiro的问题,我是将shiro集成redis的,跑的是tomcat,我真搞不清楚shiro的session和tomcat的session是什么关系?或者说如何理解两者的关系和差别?现在还要集成redis,shiro也可以实现cache将shiro session存到redis,那tomcat的session呢?我真被这个session搞晕了,求帮忙解决啊~~~

shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。


哦,谢谢涛ge指点,我再仔细看看源码先
2 楼 jinnianshilongnian 2014-08-19  
supercwg 写道
涛ge,还是要向你请教个shiro的问题,我是将shiro集成redis的,跑的是tomcat,我真搞不清楚shiro的session和tomcat的session是什么关系?或者说如何理解两者的关系和差别?现在还要集成redis,shiro也可以实现cache将shiro session存到redis,那tomcat的session呢?我真被这个session搞晕了,求帮忙解决啊~~~

shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。
1 楼 supercwg 2014-08-19  
涛ge,还是要向你请教个shiro的问题,我是将shiro集成redis的,跑的是tomcat,我真搞不清楚shiro的session和tomcat的session是什么关系?或者说如何理解两者的关系和差别?现在还要集成redis,shiro也可以实现cache将shiro session存到redis,那tomcat的session呢?我真被这个session搞晕了,求帮忙解决啊~~~

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: ...

    Spring 2.0 开发参考手册

    13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持...

    spring chm文档

    13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持...

    Spring中文帮助文档

    13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持:ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap(ModelAndView) 13.11.3. 对视图的...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    Grails权威指南

     4.1 简化的orm和grails对象关系映射(gorm)  4.2 gorm基础  4.3 设置属性可选  4.4 gorm中的关系  4.5 执行crud操作  4.5.1 创建书签  4.5.2 读取书签  4.5.3 更新书签  4.5.4 ...

    Java及大数据学习路线.pdf

    1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和Session 服务器端...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    9.2.5 事务管理和异常处理 359 9.3 使用NetBeans开发EJB 359 9.3.1 使用NetBeans开发Session Bean 359 9.3.2 使用NetBeans开发MDB 362 9.4 本章小结 363 第10章 Java持久化API(JPA) 364 10.1 实体简介 365 10.1.1 ...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

Global site tag (gtag.js) - Google Analytics