详解spring mvc对异步请求的处理
发布时间 - 2026-01-10 22:16:00 点击率:次在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>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "Callable result";
}
};
}
@RequestMapping("/view")
public Callable<String> callableWithView(final Model model) {
return new Callable<String>() {
@Override
public 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>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
if (handled) {
// see handleException method further below
throw 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>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "Callable result";
}
};
return new WebAsyncTask<String>(1000, callable);
}
@ExceptionHandler
@ResponseBody
public 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服务器的吞吐量~~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# springmvc的异步请求
# spring
# mvc
# 异步
# 异步请求
# 使用SpringBoot注解方式处理事务回滚实现
# spring boot注解方式使用redis缓存操作示例
# Spring AOP如何整合redis(注解方式)实现缓存统一管理详解
# Spring 使用注解方式进行事务管理配置方式
# spring mvc整合freemarker基于注解方式
# Spring-MVC异步请求之Servlet异步处理
# springmvc处理异步请求的示例
# SpringMVC环境下实现的Ajax异步请求JSON格式数据
# Spring中注解方式的异步请求
# 是在
# 基础上
# 可不
# 这么做
# 来完成
# 配置文件
# 再发
# 大家多多
# 客户端
# 增加了
# 连接池
# init
# param
# startup
# controller
# contextConfigLocation
# load
# DispatcherServlet
# async
# supported
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解Android图表 MPAndroidChart折线图
如何在香港服务器上快速搭建免备案网站?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
文字头像制作网站推荐软件,醒图能自动配文字吗?
JS碰撞运动实现方法详解
网站制作免费,什么网站能看正片电影?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
非常酷的网站设计制作软件,酷培ai教育官方网站?
Python文件异常处理策略_健壮性说明【指导】
javascript基本数据类型及类型检测常用方法小结
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
JS中对数组元素进行增删改移的方法总结
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
清除minerd进程的简单方法
C++时间戳转换成日期时间的步骤和示例代码
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
如何在万网自助建站中设置域名及备案?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Linux系统命令中tree命令详解
Android Socket接口实现即时通讯实例代码
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
如何在局域网内绑定自建网站域名?
如何在建站宝盒中设置产品搜索功能?
Thinkphp 中 distinct 的用法解析
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
BootStrap整体框架之基础布局组件
Laravel怎么在Controller之外的地方验证数据
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何在建站之星网店版论坛获取技术支持?
如何用wdcp快速搭建高效网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
javascript读取文本节点方法小结
Laravel怎么清理缓存_Laravel optimize clear命令详解
简单实现jsp分页
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?

