目录
Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介
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());
个人感觉事件机制中的异常处理考虑不周。
相关文章
Spring4新特性
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
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
评论
shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。
哦,谢谢涛ge指点,我再仔细看看源码先
涛ge,另外还想请教个问题,就是我要实现个通用日志记录用户操作,直接在DAO层调用SecurityUtils.getSubject().getPrincipal()获取当前用户是否会存在问题
shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。
哦,谢谢涛ge指点,我再仔细看看源码先
shiro的session可以基于web容器的或者独立的。因此看你需要了。如果用了shiro的session最好就不要再把数据放入到web容器的session中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。
相关推荐
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: ...
13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持...
13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持...
13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持:ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap(ModelAndView) 13.11.3. 对视图的...
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中自动搜索组件...
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 ...
1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和Session 服务器端...
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 ...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................