全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解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>() {
      @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 


相关文章: 如何设置并定期更换建站之星安全管理员密码?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何在万网自助建站中设置域名及备案?  如何用虚拟主机快速搭建网站?详细步骤解析  建站VPS推荐:2025年高性能服务器配置指南  如何在腾讯云服务器上快速搭建个人网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在腾讯云免费申请建站?  如何基于云服务器快速搭建网站及云盘系统?  如何在阿里云ECS服务器部署织梦CMS网站?  Android使用GridView实现日历的简单功能  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站之星安装需要哪些步骤及注意事项?  建站之星如何通过成品分离优化网站效率?  安云自助建站系统如何快速提升SEO排名?  个人摄影网站制作流程,摄影爱好者都去什么网站?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何在搬瓦工VPS快速搭建网站?  微信小程序 五星评分(包括半颗星评分)实例代码  学校建站服务器如何选型才能满足性能需求?  建站之星后台管理系统如何操作?  教学网站制作软件,学习*后期制作的网站有哪些?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  家具网站制作软件,家具厂怎么跑业务?  网站制作公司排行榜,抖音怎样做个人官方网站  网站制作价目表怎么做,珍爱网婚介费用多少?  如何在VPS电脑上快速搭建网站?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  怀化网站制作公司,怀化新生儿上户网上办理流程?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  红河网站制作公司,红河事业单位身份证如何上传?  如何快速辨别茅台真假?关键步骤解析  已有域名和空间如何搭建网站?  小程序网站制作需要准备什么资料,如何制作小程序?  如何构建满足综合性能需求的优质建站方案?  黑客如何利用漏洞与弱口令入侵网站服务器?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  宝塔建站助手安装配置与建站模板使用全流程解析  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  专业网站建设制作报价,网页设计制作要考什么证?  如何用IIS7快速搭建并优化网站站点?  孙琪峥织梦建站教程如何优化数据库安全?  建站之星安装后如何自定义网站颜色与字体?  寿县云建站:智能SEO优化与多行业模板快速上线指南  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  太平洋网站制作公司,网络用语太平洋是什么意思?  建站之星安装失败:服务器环境不兼容?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。