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

简介: <p>Spring 4.1对异步调用提供了AsyncResult及SuccessCallback、FailureCallback、和异常处理的支持;对事件调度也提供了相应的异常处理器。</p> <p> </p> <p><strong>1、事件调度异常处理器</strong></p> <p>1.1、定义异常处理器:</p> <div id="" class="dp-highlight

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

 

个人感觉事件机制中的异常处理考虑不周。


本文转自http://jinnianshilongnian.iteye.com/blog/2105772

目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
3月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
57 0
|
17天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
67 14
|
28天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
63 8
|
1月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
54 4
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
76 8
|
2月前
|
开发框架 Java UED
如何使用 Spring Boot 实现异常处理
如何使用 Spring Boot 实现异常处理
46 2
|
2月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
35 0
|
4月前
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot