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

 

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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值