目录
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中,这俩可能是独立变更的。会话就是在服务端保存用户信息的,存到哪怎么存你说了算。
相关推荐
Spring 4.1是Spring框架的一个重要更新,虽然没有引入革命性的新特性,但它的主要改进集中在增强现有功能和依赖库的升级。以下是对这些新特性的详细分析: 1. **核心部分增强**: - **DirectFieldAccessor**:允许...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Spring 是一个广泛使用的 Java 应用开发框架,尤其在企业级应用中非常流行,它提供了依赖注入、面向切面编程...
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. 对视图的支持: ...
Spring 2.0引入了异步JMS机制,使得消息处理能够在独立的线程中执行,提高了系统的响应速度和并发能力。 #### 3.4 JDBC增强 Spring 2.0优化了JDBC的封装,提供了更丰富的数据库操作API,减少了模板代码的数量,...
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 ...
4. **队列和任务调度**:支持异步任务处理和定时任务调度,增强应用的灵活性。 5. **社区支持和文档**:拥有活跃的社区和详尽的文档资源。 #### 七、Flask(Python) **简介** Flask 是一个轻量级的 Python Web ...
2.4 **JMS(Java Message Service)**:JMS提供了一种标准的API,用于创建、发送、接收和读取消息,常用于异步通信和解耦应用程序。 2.5 **JDBC(Java Database Connectivity)**:JDBC是Java访问数据库的标准接口...
7.2 Docker与Kubernetes:容器化技术简化了应用部署和扩展, Kubernetes提供集群管理和自动调度。 通过本实训课程,学者将全面学习Java BS架构下的企业管理软件设计,包括但不限于系统分析、需求建模、数据库设计、...
4.3 异步处理:使用Java的ExecutorService或Quartz调度任务,如批量发送邮件提醒,避免阻塞主线程。 4.4 性能监控:集成JMX(Java Management Extensions)进行系统监控,及时发现并解决性能瓶颈。 五、系统测试与...
消息队列用于在不同的系统之间传递消息,支持发布/订阅模式,可以实现解耦和异步处理。 **4.3 请求队列** 用于存放客户端发送过来的请求,有助于缓解高峰期服务器的压力。 #### 五、扩容 **5.1 单体垂直扩容** ...
- **Job执行器** 用于调度和执行异步任务,例如定时任务或外部系统调用。 - 它支持多种类型的作业,并且可以通过配置进行扩展。 #### 三、jBPM jPDL安装与配置 ##### 3.1 下载包概述 - **jPDL 3.12**:这是jPDL的一...
- **JAVA NIO**: 提供了基于通道(Channel)和缓冲区(Buffer)的新的IO处理方式,提高了IO操作的性能和灵活性。 - **NIO的缓冲区**: 用于存储不同数据类型的临时容器,包括ByteBuffer、CharBuffer等。 - **NIO的非...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................