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

1、修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
...
</web-app>

1.1、声明version="3.0",声明web-app_3_0.xsd

1.2、为servlet或者filter设置启用异步支持:<async-supported>true</async-supported>,修改WEB应用的web.xml

<!-- spring mvc -->
<servlet>
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>...</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>

2、使controller类支持async

2.1、返回java.util.concurrent.Callable来完成异步处理

package org.springframework.samples.mvc.async;import java.util.concurrent.Callable;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.async.WebAsyncTask;@Controller
@RequestMapping("/async/callable")
public class CallableController {@RequestMapping("/response-body")public @ResponseBody Callable<String> callable() {return new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);return "Callable result";}};}@RequestMapping("/view")public Callable<String> callableWithView(final Model model) {return new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);model.addAttribute("foo", "bar");model.addAttribute("fruit", "apple");return "views/html";}};}@RequestMapping("/exception")public @ResponseBody Callable<String> callableWithException(final @RequestParam(required=false, defaultValue="true") boolean handled) {return new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);if (handled) {// see handleException method further belowthrow new IllegalStateException("Callable error");}else {throw new IllegalArgumentException("Callable error");}}};}@RequestMapping("/custom-timeout-handling")public @ResponseBody WebAsyncTask<String> callableWithCustomTimeoutHandling() {Callable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);return "Callable result";}};return new WebAsyncTask<String>(1000, callable);}@ExceptionHandler@ResponseBodypublic String handleException(IllegalStateException ex) {return "Handled exception: " + ex.getMessage();}}

2.2、在异步处理完成时返回org.springframework.web.context.request.async.DeferredResult其他线程,例如一个JMS或一个AMQP消息,Redis通知等等:

@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<String> quotes() {DeferredResult<String> deferredResult = new DeferredResult<String>();// Add deferredResult to a Queue or a Map...return deferredResult;
}// In some other thread...
deferredResult.setResult(data);
// Remove deferredResult from the Queue or Map

3、spring配置文件的修改

spring mvc的dtd的声明必须大于等于3.2

<mvc:annotation-driven>
<!--  可不设置,使用默认的超时时间 --><mvc:async-support default-timeout="3000"/>
</mvc:annotation-driven>

实际使用示例:

function deferred(){$.get('quotes.htm',function(data){console.log(data);deferred();//每次请求完成,再发一次请求,避免客户端定时刷新来获取数据
    });
}

这么做的好处避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量~~

可以看下这个blog,还不错:http://wiselyman.iteye.com/blog/2215852

spring mvc对异步请求的处理相关推荐

  1. 高性能的关键:Spring MVC的异步模式

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数W ...

  2. Spring MVC的异步模式DefferedResult

    原文:http://www.importnew.com/21051.html 什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服 ...

  3. java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...

  4. Spring MVC处理用户请求的完整流程

    Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 技术.Velocity.Tiles.iText 和 POI. Spring MVC 框架并不关心使用的视图技术,也不会强迫开发 ...

  5. 详解Spring框架的异步请求

    文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...

  6. java 异步处理数据格式_spring mvc对异步请求的处理

    在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...

  7. Spring及Springboot 异步请求

    1.java 异步请求 Spring在3.2的版本上就已经为我们提供的相应的机制,以应对Http Nio的场景. 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基 ...

  8. java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数

    在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...

  9. Spring MVC 异步处理请求,提高程序性能

    原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能?一个普通 Servlet ...

最新文章

  1. List中remove()方法的陷阱,被坑惨了!
  2. vue.js 多图上传,并可预览
  3. 常用的web安全处理
  4. 利用正则表达式 替换字符串中多个 URL
  5. 【运动学】基于matlab平抛小球地面跳跃规律【含Matlab源码 981期】
  6. 单向链表存储方式下插入、删除、搜索
  7. java虚拟机 安卓系统下载_java虚拟机下载 v5.0 官方免费版
  8. mysql ocp考试大纲_MySQL OCP考试大纲
  9. linux任务计划时间讲解,linux下计划任务详解
  10. leggedrobotics free gait 足式机器人自由步态 苏黎世机器人系统实验室
  11. ARM汇编之合法立即数的快速判断方法
  12. 几何平均数和调和平均数是什么?有什么作用?详细资料讨论他们的区别
  13. 安装Linux镜像文件,通过iso镜像文件硬盘安装Liunx (转载)
  14. 伊诺伊香槟分校计算机世界排名,2020年伊利诺伊大学香槟分校QS世界排名
  15. python发行版是什么意思_致 Python 初学者
  16. 用java实现图片合并与折叠
  17. java编程实现求回文数_Java编程之回文数
  18. Google 百度 图标收藏
  19. 对当下AI的一些思考
  20. 存储大师班:NFS 的诞生与成长

热门文章

  1. ReactiveX流式编程—从xstream讲起
  2. ThingJS平台制作第一人称视角下的巡更效果
  3. 我的小白同事接触白鹭引擎4天,成功做了一款足球小游戏
  4. 57、Design Support Library 介绍及环境搭建
  5. ionic 旅途-- 一起来填坑
  6. 【源码阅读】dbutil包中BasicRowProcessor内部类CaseInsensiti...
  7. Java的接口与继承
  8. oracle 10g SQL* Plus主机字符串
  9. 普通域用户设置共享文件夹
  10. 【React深入】深入分析虚拟DOM的渲染原理和特性