`
twincle
  • 浏览: 41521 次
  • 性别: 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-chat:使用Spring MVC 3.2的示例代码,基于Servlet的异步支持

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

    详解spring mvc对异步请求的处理

    spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的,有兴趣的可以了解一下。

    看透springMvc源代码分析与实践

    22.2.2 Spring MVC对异步请求的支持297 22.2.3 WebAsyncTask和Callable类型异步请求的处理过程及用法301 22.2.4 DeferredResult类型异步请求的处理过程及用法303 22.2.5 ListenableFuture类型异步请求的处理过程...

    Inflearn-Spring-MVC:[互联网讲座] Infron-Spring MVC第一卷,用于后端Web开发的核心技术(Younghan Kim)

    Infron-Spring MVC第1卷核心技术(用于后端Web开发)(Younghan Kim) SSR,CSR SSR(服务器端渲染) HTML最终结果在服务器上创建并交付到Web浏览器 主要用于静态屏幕 相关技术:JSP,Thymeleaf CSR(客户端渲染...

    Servle和JSP学习指南,完整扫描版

    第14章讨论Servlet 3中的一项新特性,用来处理异步的操作;第15章阐述如何通过声明和编程方式来保护Java的Web应用程序;第16章讨论Servlet/JSP应用程序的部署过程,以及部署描述符中的元素;第17章阐述Servlet 3中的...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    Spring中文帮助文档

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    Spring API

    2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    纯servlet+jsp后台管理 无任何框架

    公司要求的,只用servlet和jsp,不能...servlet使用注解方式,另外一个servlet可以处理多个请求,方式和spring mvc类似。这点和网上其他人写的servlet处理多方法加一个method参数不一样。其它也不算难的技术,一看就懂

    spring security 参考手册中文版

    15.2.5异步Servlet支持 130 15.3 Servlet 3.1+集成 131 15.3.1 HttpServletRequest#changeSessionId() 132 16.基本和摘要式身份验证 132 16.1 BasicAuthenticationFilter 132 16.1.1配置 132 16.2 ...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    springboot学习思维笔记.xmind

    Servlet3.0+异步方法处理 Spring MVC的测试 MockMVC MockHttpServlerRequest MockHttpServletResponse MockHttpSession SpringBoot基础 SpringBoot概述 什么是SpringBoot SpringBoot核心...

    spring-webflux-research:Springwebflux研究

    架构上spring-webflux与spring-webmvc同级,是spring-webmvc的替代方案,底层网络模型脱离Servlet Api,采用了基于NIO的网络编程框架,支持包括Tomcat,Jetty,Netty等。spring-webflux依然沿用了与spring-webmvc...

    SpringMVC环境下实现的Ajax异步请求JSON格式数据

    首先是常规的spring mvc环境搭建,不用多说,需要注意的是,这里需要引入jackson相关jar包,然后在spring配置文件“springmvc-servlet.xml”中添加json解析相关配置,我这里的完整代码如下: &lt;?xml version=1.0 ...

    第三方支付对接Java开发工具包

    2. 也不依赖 servlet,仅仅作为工具使用,可轻松嵌入到任何系统里(项目例子利用spring mvc的 @PathVariable进行,推荐使用类似的框架) 3. 支付请求调用支持HTTP和异步、支持http代理,连接池 4. 简单快速完成支付...

    java面试题

    答:多形:一个类中多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页属性 session 会话 out 输出 page 当前网页 exception 错误网页 application ...

    charon-spring-boot-starter:以Spring Boot启动器形式的反向代理实现

    Charon Spring启动启动器 Charon是反向代理实现。...产品特点高度可配置和可扩展Spring 和支持多请求转发映射负载均衡灵活的路径重写支持基于指标异步请求转发认证方式Cookies改写“ X转发” HTTP标头支持转发过

Global site tag (gtag.js) - Google Analytics