详解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分页  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?