`
zzc1684
  • 浏览: 1229157 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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、定义异常处理器:

Java代码  收藏代码
  1. public class MyErrorHandler implements ErrorHandler {  
  2.     @Override  
  3.     public void handleError(Throwable throwable) {  
  4.         System.out.println("事件失败了, error message : " + throwable.getMessage());  
  5.     }  
  6. }  

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

 

1.2、配置异常处理器:

Java代码  收藏代码
  1. <!-- 名字必须是applicationEventMulticaster和messageSource是一样的,默认找这个名字的对象 -->  
  2. <!-- 名字必须是applicationEventMulticaster,因为AbstractApplicationContext默认找个 -->  
  3. <!-- 如果找不到就new一个,但不是异步调用而是同步调用 -->  
  4. <bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">  
  5.     <!-- 注入任务执行器 这样就实现了异步调用(缺点是全局的,要么全部异步,要么全部同步(删除这个属性即是同步))  -->  
  6.     <property name="taskExecutor" ref="executor"/>  
  7.     <property name="errorHandler" ref="myErrorHandler"/>  
  8. </bean>  
  9.   
  10. <bean id="myErrorHandler" class="com.sishuok.error.MyErrorHandler"/>  

当执行的ApplicationListener中有异常时会回调该ErrorHandler,但是从目前的回调实现来看,适合做日志记录,其他的无意义。本文是使用的代码基于《详解Spring事件驱动模型》。

 

2、异步调度异常处理器

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

Java代码  收藏代码
  1. public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {  
  2.   
  3.     @Override  
  4.     public void handleUncaughtException(Throwable throwable, Method method, Object... args) {  
  5.         System.out.println("调用异步任务出错了, message : " + throwable.getMessage());  
  6.     }  
  7. }  

如上异常处理器的好处比事件机制的好处在于多了出错的位置和参数,可以根据这些信息进行相应的处理。

 

配置文件:

Java代码  收藏代码
  1. <bean id="asyncExceptionHandler" class="com.github.zhangkaitao.spring.service.MyAsyncExceptionHandler"/>  
  2. <task:annotation-driven exception-handler="asyncExceptionHandler" proxy-target-class="true" />  

  

异步Service:

Java代码  收藏代码
  1. @Service  
  2. @Async  
  3. public class AsyncService {  
  4.   
  5.     public void throwException() {  
  6.         throw new RuntimeException("error");  
  7.     }  
  8.   
  9.     public String asyncGet1() {  
  10.         return "123";  
  11.     }  
  12.   
  13.     //返回值必须是ListenableFuture/Future,因为是实现的问题(return ((AsyncListenableTaskExecutor) executor).submitListenable(task);)  
  14.     public ListenableFuture<String> asyncGet2() {  
  15.         return new AsyncResult<String>("123");  
  16.     }  
  17.   
  18. }  

当调用throwException时就会抛出异常并被异常处理器捕获到。

 

另外在之前文章中没有介绍异步方法的返回值,其返回值支持Future/ListenableFuture;然后调用者可以在此等待。Spring 4.1提供了AsyncResult(实现了ListenableFuture)用于返回异步结果。

 

ListenableFuture提供了新的回调(SuccessCallback和FailureCallback):

Java代码  收藏代码
  1. ListenableFuture<String> listenableFuture = asyncService.asyncGet2();  
  2. SuccessCallback<String> successCallback = new SuccessCallback<String>() {  
  3.     @Override  
  4.     public void onSuccess(String str) {  
  5.         System.out.println("异步回调成功了, return : " + str);  
  6.     }  
  7. };  
  8. FailureCallback failureCallback = new FailureCallback() {  
  9.     @Override  
  10.     public void onFailure(Throwable throwable) {  
  11.         System.out.println("异步回调失败了, exception message : " + throwable.getMessage());  
  12.     }  
  13. };  
  14.   
  15. listenableFuture.addCallback(successCallback, failureCallback);  
  16. 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

 
评论
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搞晕了,求帮忙解决啊~~~
分享到:
评论

相关推荐

    浅析Spring4新特性概述

    Spring 4.1是Spring框架的一个重要更新,虽然没有引入革命性的新特性,但它的主要改进集中在增强现有功能和依赖库的升级。以下是对这些新特性的详细分析: 1. **核心部分增强**: - **DirectFieldAccessor**:允许...

    netty4与spring集成

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Spring 是一个广泛使用的 Java 应用开发框架,尤其在企业级应用中非常流行,它提供了依赖注入、面向切面编程...

    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-reference

    Spring 2.0引入了异步JMS机制,使得消息处理能够在独立的线程中执行,提高了系统的响应速度和并发能力。 #### 3.4 JDBC增强 Spring 2.0优化了JDBC的封装,提供了更丰富的数据库操作API,减少了模板代码的数量,...

    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 ...

    【后端开发框架】教程&案例&相关项目资源.docx

    4. **队列和任务调度**:支持异步任务处理和定时任务调度,增强应用的灵活性。 5. **社区支持和文档**:拥有活跃的社区和详尽的文档资源。 #### 七、Flask(Python) **简介** Flask 是一个轻量级的 Python Web ...

    j2ee学习笔记

    2.4 **JMS(Java Message Service)**:JMS提供了一种标准的API,用于创建、发送、接收和读取消息,常用于异步通信和解耦应用程序。 2.5 **JDBC(Java Database Connectivity)**:JDBC是Java访问数据库的标准接口...

    Java BS架构企业管理软件设计综合实训课程

    7.2 Docker与Kubernetes:容器化技术简化了应用部署和扩展, Kubernetes提供集群管理和自动调度。 通过本实训课程,学者将全面学习Java BS架构下的企业管理软件设计,包括但不限于系统分析、需求建模、数据库设计、...

    基于Java的图书馆书库管理系统设计与实现

    4.3 异步处理:使用Java的ExecutorService或Quartz调度任务,如批量发送邮件提醒,避免阻塞主线程。 4.4 性能监控:集成JMX(Java Management Extensions)进行系统监控,及时发现并解决性能瓶颈。 五、系统测试与...

    Java高级架构必备知识点

    消息队列用于在不同的系统之间传递消息,支持发布/订阅模式,可以实现解耦和异步处理。 **4.3 请求队列** 用于存放客户端发送过来的请求,有助于缓解高峰期服务器的压力。 #### 五、扩容 **5.1 单体垂直扩容** ...

    JBoss jBPM jPDL中文指南

    - **Job执行器** 用于调度和执行异步任务,例如定时任务或外部系统调用。 - 它支持多种类型的作业,并且可以通过配置进行扩展。 #### 三、jBPM jPDL安装与配置 ##### 3.1 下载包概述 - **jPDL 3.12**:这是jPDL的一...

    阿里P8 架构师整理Java学习笔记.pdf

    - **JAVA NIO**: 提供了基于通道(Channel)和缓冲区(Buffer)的新的IO处理方式,提高了IO操作的性能和灵活性。 - **NIO的缓冲区**: 用于存储不同数据类型的临时容器,包括ByteBuffer、CharBuffer等。 - **NIO的非...

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

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

Global site tag (gtag.js) - Google Analytics