spring mvc对异步请求的处理
在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对异步请求的处理相关推荐
- 高性能的关键:Spring MVC的异步模式
什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数W ...
- Spring MVC的异步模式DefferedResult
原文:http://www.importnew.com/21051.html 什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服 ...
- java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)
什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...
- Spring MVC处理用户请求的完整流程
Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 技术.Velocity.Tiles.iText 和 POI. Spring MVC 框架并不关心使用的视图技术,也不会强迫开发 ...
- 详解Spring框架的异步请求
文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...
- java 异步处理数据格式_spring mvc对异步请求的处理
在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...
- Spring及Springboot 异步请求
1.java 异步请求 Spring在3.2的版本上就已经为我们提供的相应的机制,以应对Http Nio的场景. 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基 ...
- java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数
在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...
- Spring MVC 异步处理请求,提高程序性能
原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能?一个普通 Servlet ...
最新文章
- List中remove()方法的陷阱,被坑惨了!
- vue.js 多图上传,并可预览
- 常用的web安全处理
- 利用正则表达式 替换字符串中多个 URL
- 【运动学】基于matlab平抛小球地面跳跃规律【含Matlab源码 981期】
- 单向链表存储方式下插入、删除、搜索
- java虚拟机 安卓系统下载_java虚拟机下载 v5.0 官方免费版
- mysql ocp考试大纲_MySQL OCP考试大纲
- linux任务计划时间讲解,linux下计划任务详解
- leggedrobotics free gait 足式机器人自由步态 苏黎世机器人系统实验室
- ARM汇编之合法立即数的快速判断方法
- 几何平均数和调和平均数是什么?有什么作用?详细资料讨论他们的区别
- 安装Linux镜像文件,通过iso镜像文件硬盘安装Liunx (转载)
- 伊诺伊香槟分校计算机世界排名,2020年伊利诺伊大学香槟分校QS世界排名
- python发行版是什么意思_致 Python 初学者
- 用java实现图片合并与折叠
- java编程实现求回文数_Java编程之回文数
- Google 百度 图标收藏
- 对当下AI的一些思考
- 存储大师班:NFS 的诞生与成长