`
twincle
  • 浏览: 41799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Spring MVC 3.2 技术预览(一):Servlet 3介绍,异步支持

阅读更多

原文地址:http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/

 

概述:

        Spring MVC 3.2 M1将引入基于Servlet 3.0支持的异步请求处理,我将针对Spring MVC 3.2的新特性发布一系列文章,并通过对背景知识和相关内容的充分介绍,让你了解你为什么需要这些新特性,以及如何使用这些新特性。这是这一系列文章中的第一篇。


        Spring MVC 3.2的更新内容已经可以在Spring Framework Github中查看,也可以将http://repo.springsource.org/snapshot设置在你的项目仓库中,来获取快照版本。在后面的文章中,我也将提供一些源码示例的链接。但如果你想现在就尝试这些新特性,也可以在GitHub上签出spring-mvc-async中的spring-mvc-showcase项目,并通过提交记录查看其中的更新信息。

 

惊鸿一瞥:

        从编程模型的角度来看,可能会出现看似简单的新功能。现在,控制层(Controller)的方法可以返回Callable类型来完成异步请求的处理。Spring MVC 3.2会在TaskExecutor的帮助下在一个独立的线程中调用这个返回值,可以查看下面这个代码片段:

 

@RequestMapping(method=RequestMethod.POST)
public Callable<String> processUpload(final MultipartFile file) {
 
  return new Callable<String>() {
    public Object call() throws Exception {
      // ...
      return "someView";
    }
  };
}

 

         另一种方式,是在控制层(Controller)方法中返回DeferredResult类型(这是Spring MVC 3.2中的新成员),在任意的线程中完成异步处理。例如对一个外部事件(例如JMS信息、AMQP信息、Redis信息等)作出反应,下面是另外一个代码片段:

 

@RequestMapping("/quotes")
@ResponseBody
public DeferredResult quotes() {
  DeferredResult deferredResult = new DeferredResult();
  // Add deferredResult to a Queue or a Map...
  return deferredResult;
}
 
// In some other thread..
// Set the return value on the deferredResult
 
deferredResult.set(data);

 

         大家肯定对上面的代码片段有很多问题,我会在后面一系列的文章中给出更多的细节信息。在我们深入了解之前,我先介绍一些可能会用到的相关技术背景知识。

 

长连接请求:

        当前一些网络应用最常用的异步处理方式就是长连接方式,例如运行一个缓慢的数据库查询、调用一个外部的REST API或者执行其他I/O操作。这些方式很快就会消耗光Servlet容器的线程池,影响程序的可扩展性。

        在一些情况下,你可能需要等待一个处理完成,例如发送邮件、删除数据库操作等。在这种“即发即忘”(fire-and-forget)情况下,你可以使用Spring注解@Async或设置Spring Integration事件并迅速返回,也许还可以返回一个用于确认的ID,为后续的响应所用。这在Spring MVC 3.2之前就可以实现,并且可以避免请求死锁。

        对于结果返回之前需要的其他情况下,你需要先释放处理请求的Servlet容器线程来提高程序的可扩展性。为了实现这个功能,Servlet 3允许一个Servlet在返回请求之后声明保持响应为打开状态,这样请求就可以在一个独立线程中完成。

        为了实现这个功能,可以调用Servlet 3中的request.startAsync()方法,并使用返回的AsyncContext在一个独立线程内继续写入(并最终完成)响应。这在客户端看来没有任何变化,请求仍然看起来像是其他HTTP标准的“请求—相应”一样。但是,在服务器端看来,异步请求处理可以让你以扩展性更好的方式处理请求。下面就是处理异步请求的事件顺序:

 

  1. 客户端发送一个请求
  2. Servlet容器调用一个Servlet(同时分配一个线程)
  3. Servlet调用 request.startAsync(),保存并返回 AsyncContext
  4. Servlet容器的线程被释放,但是响应保持打开状态
  5. 另一个线程使用保存的 AsyncContext完成响应
  6. 客户端收到响应信息

 

        关于Servlet对异步请求处理的支持,还有很多内容,你可以找到很多示例文章(文章被墙了),但是上面总结的这些是所需要的最基本的概念。

 

总结:

        在下一篇文章中,我将介绍第二种异步请求处理的方式:客户端浏览器无延时的实时获取服务器的更新信息。过去已经发展出了很多方式实现这个功能,一些停留在HTTP标准的“请求—相应”的语义环境下,另一些则以更好的方式实现。

分享到:
评论

相关推荐

    毕业设计&课设_基于Spring MVC 3.2与Servlet 异步支持的聊天示例代码(含分布式聊天).zip

    该资源内项目源码是个人的课程设计、毕业...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    spring-mvc-chat:使用Spring MVC 3.2的示例代码,基于Servlet的异步支持

    概述使用Spring MVC 3.2(基于Servlet)的异步请求处理的聊天示例。 另请参阅分支以进行分布式聊天。笔记Tomcat中有一个错误会影响此示例。 请使用Tomcat 7.0.32或更高版本。指示Eclipse用户运行mvn eclipse:eclipse...

    框架springmvc3.2+spring3.2+mybatis3.11+maven整合

    Spring MVC 3.2引入了改进的类型安全的`@RequestMapping`注解,支持异步处理,以及增强的异常处理机制。此外,它还支持JSR-303 Bean验证,使得验证逻辑更加规范。 **Spring 3.2** Spring框架的核心在于依赖注入(DI...

    Spring MVC Cookbook(PACKT,2016).pdf

    《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...

    Spring mvc 教程

    - **异步请求的处理**:Spring MVC 支持异步处理,可以提高应用的响应性和性能。 - **对控制器测试**:Spring 提供了工具和支持来方便地测试控制器的行为。 #### 处理器映射 (Handler Mapping) - **使用 ...

    Mastering Spring MVC 4(2015.09)源码

    首先,Spring MVC 4基于Servlet 3.0规范,这意味着它可以利用异步处理能力,提高了Web应用的性能。通过AsyncSupport和AsyncConfigurer接口,开发者可以轻松地创建异步控制器,处理高并发场景。 控制器(Controller...

    第三章 Spring MVC Servlet API与Json的支持

    在本章中,我们将深入探讨Spring MVC框架与Servlet API以及JSON支持的相关知识。Spring MVC是Spring框架的一个核心模块,主要用于构建Web应用程序,它提供了一种优雅的方式来处理HTTP请求和响应,实现了模型-视图-...

    Spring MVC 文件上传下载 后端 - Java.zip

    6. **优化**:为了提高性能,可以使用异步处理文件上传和下载,利用Spring MVC的AsyncController或者Servlet 3.0的异步处理特性。另外,对于大文件操作,可以考虑分块上传和下载。 7. **实际应用场景**:这些功能...

    spring mvc3.2.7+servlet3.1(jetty)+maven3+eclipse

    在构建Web应用程序时,"spring mvc3.2.7 + servlet3.1(jetty) + maven3 + eclipse"的组合提供了一种高效且灵活的开发环境。这个配置涉及了多个关键组件,它们共同作用于项目的搭建、管理和运行。 **Spring MVC ...

    springmvc_jpbm5_document.zip_spring mvc

    1. **Spring MVC + jQuery easyUI 做的ajax版本用户管理**:这可能是一个使用Spring MVC处理后端请求,并结合jQuery的easyUI库来实现前端页面的动态更新,特别是用户管理功能,涉及到Ajax异步通信和JSON数据交换。...

    spring mvc

    Spring MVC 支持异步请求处理,可以轻松地处理 AJAX 请求。通常会使用 `@ResponseBody` 注解来返回 JSON 或 XML 数据格式。 #### 十六、Spring MVC 配置文件说明 Spring MVC 支持多个配置文件,每个配置文件可以...

    Spring3.2中文版.docx

    24. **Servlet 3异步请求处理**:Spring 3.2支持Servlet 3.0的异步处理,提升了高并发场景下的性能。 25. **Spring MVC测试框架**:提供了强大的测试工具,简化了Spring MVC应用的测试。 26. **内容协商改进**:优化...

    spring MVC基础学习

    Spring MVC 是一款基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。在Spring MVC中,开发者可以利用模型-视图-控制器(MVC)架构模式来分离业务逻辑、数据处理和...

    spring mvc所用jar包

    Spring MVC 是一个基于 Spring 框架的 Model-View-Controller (MVC) 模型的轻量级 Web 开发框架。它简化了在 Java 应用程序中开发 web 功能的过程,提供了一种模块化且松耦合的架构,支持多种视图技术,如 JSP、...

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    3. **Chapter 05** - Spring MVC:介绍Spring MVC作为Java EE Web应用程序的模型-视图-控制器(MVC)架构。讨论DispatcherServlet、Controller接口、ModelAndView对象、视图解析器和数据绑定等概念。 4. **Chapter ...

    spring mvc demo

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。Spring MVC 的设计目的是简化开发,提高可测试性,并与其他Spring框架无缝集成,如Spring Core、...

    spring mvc中启动netty

    - **Spring MVC配置**:在Spring MVC中,我们需要配置一个适配器,以便Netty服务器能够理解Spring MVC的控制器。 - **消息编码解码器**:Netty需要消息编码解码器来将HTTP请求转换为Spring MVC可以处理的形式,...

    spring2.0MVC+spring2.5MVC+portletMVC

    4. **AJAX支持**:通过jQuery和JSON,Spring 2.5更好地支持了异步请求和响应。 5. **更多注解驱动的开发**:例如,@ModelAttribute用于将请求参数绑定到模型对象,@InitBinder用于初始化数据绑定行为。 至于...

    Spring MVC 4.2.4.RELEASE 中文文档v

    Spring Web MVC 的新特性部分详细介绍了该版本相较于之前版本的新功能和改进,包括但不限于对异步请求处理、测试支持、内容协商和文件上传功能的增强等。这为开发者提供了解决问题的新方法,并提高了开发效率。 ...

    spring-mvc-jquery.zip_jquery_mvc jquery_spring jquery_spring mvc

    总之,"spring-mvc-jquery.zip"项目是一个宝贵的资源,它展示了Spring MVC和jQuery的集成应用,可以帮助开发者深入了解这两种技术的结合,提升Web开发技能。通过深入研究和实践这个示例,开发者能够更好地应对复杂的...

Global site tag (gtag.js) - Google Analytics