`

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服务器的吞吐量~~

分享到:
评论

相关推荐

    最全的Spring MVC注解例子,异步请求,错误处理

    在这个“最全的Spring MVC注解例子”中,我们将深入探讨Spring MVC的核心注解,以及如何实现异步请求处理和错误管理。 1. **Spring MVC核心注解** - `@Controller`:标记一个类为处理HTTP请求的控制器。这是Spring...

    Spring MVC异步模式

    最后,我们可以通过查看源码进一步理解Spring MVC异步处理的实现细节。`AsyncWebRequest`对象用于封装异步请求的信息,而`AsyncManager`提供了启动和结束异步操作的方法。在实际开发中,我们还可以自定义`...

    详解spring mvc对异步请求的处理

    【Spring MVC 异步请求处理】 在现代Web应用程序中,为了提供更好的用户体验,异步请求处理变得至关重要。Spring MVC从3.2版本开始,引入了对异步请求的支持,这主要建立在Servlet 3.0及其以上版本的异步处理功能之...

    一个实用了spring mvc和ajax异步请求的例子

    总结起来,这个"一个实用了spring mvc和ajax异步请求的例子"涵盖了Web开发中的重要概念,包括Spring MVC的Controller设计、RESTful API的实现以及Ajax的异步数据交互。这样的组合使得Web应用更加动态,用户体验更佳...

    Spring3.2异步处理http请求

    在传统的Spring MVC中,控制器方法是同步执行的,这意味着一个请求必须等待当前方法执行完毕才能处理下一个请求。当处理过程中包含大量计算或I/O操作时,这可能导致请求阻塞,降低系统效率。 ### 2. 异步处理API ...

    Spring MVC 4.2.3

    Spring MVC是Spring框架的一个...它的特性涵盖了从请求处理到响应生成的整个流程,确保了良好的开发体验和高质量的应用程序。在实际工作中,深入理解和熟练掌握Spring MVC,将对提升开发效率和应用质量起到关键作用。

    Spring MVC 教程快速入门 深入分析

    十五、Spring MVC处理ajax请求:讲解了如何在Spring MVC中处理异步JavaScript和XML(AJAX)请求,包括配置和控制器中的代码实现。 十六、Spring MVC关于写几个配置文件的说明:介绍了在Spring MVC项目中需要配置...

    spring MVC .docx

    14. **Asynchronous Request Processing**: Spring MVC支持异步请求处理,可以通过`@Async`注解实现后台任务的并发执行。 15. **Internationalization (i18n) and Localization (l10n)**: Spring MVC提供对国际化和...

    spring mvc 4.0

    8. **异步处理**:Spring MVC 4.0引入了异步请求处理,通过@ControllerAdvice和@Async注解,可以实现后台任务的异步执行,提高响应速度。 9. **多Part文件上传**:支持多文件上传,利用MultipartFile接口处理上传...

    Spring mvc 教程

    - **异步请求的处理**:Spring MVC 支持异步处理,可以提高应用的响应性和性能。 - **对控制器测试**:Spring 提供了工具和支持来方便地测试控制器的行为。 #### 处理器映射 (Handler Mapping) - **使用 ...

    Mastering Spring MVC 4(2015.09)源码

    拦截器(Interceptor)是Spring MVC中的一种机制,可以在请求处理前、后执行自定义逻辑。通过实现HandlerInterceptor接口或使用@Interceptor注解,开发者可以添加全局的行为,如日志记录、权限检查等。 此外,...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    在现代Web应用开发中,Spring MVC作为主流的MVC框架,常常被用来处理HTTP请求。同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何...

    详解Spring MVC的异步模式(高性能的关键)

    以下是一个简单的Spring MVC异步处理示例: ```java @RequestMapping(value="/asynctask", method = RequestMethod.GET) public DeferredResult&lt;ModelAndView&gt; asyncTask(){ DeferredResult&lt;ModelAndView&gt; ...

    spring mvc ajax异步文件的上传和普通文件上传

    在Spring MVC框架中,文件上传是一项常见的功能,无论是普通的文件上传还是通过Ajax实现的异步文件上传,都为用户提供了更好的交互体验。本篇将详细讲解这两种方式的实现原理及步骤。 首先,让我们来理解一下普通...

    spring mvc

    Spring MVC 支持异步请求处理,可以轻松地处理 AJAX 请求。通常会使用 `@ResponseBody` 注解来返回 JSON 或 XML 数据格式。 #### 十六、Spring MVC 配置文件说明 Spring MVC 支持多个配置文件,每个配置文件可以...

    spring mvc 整合包

    Spring MVC 是一个强大的Java Web应用程序开发框架,是Spring框架的一部分,专注于处理Web请求和返回响应。它提供了模型-视图-控制器(MVC)架构,帮助开发者构建灵活、可维护的Web应用。在这个"spring mvc 整合包...

    精通spring mvc 4 看透springmvc pdf 高清完全版

    书中还详细讲解了如何使用Spring MVC进行文件上传和下载,以及处理异步请求。 此外,书中涵盖了Spring MVC与模板引擎的集成,如FreeMarker、Thymeleaf等,这些模板引擎可以帮助开发者更方便地设计和渲染视图。同时...

    Spring MVC跟jQuery和Twitter Bootstrap的结合

    jQuery通过Ajax函数发送请求到特定的Spring MVC处理方法,获取数据后更新页面部分内容,实现局部刷新。 3. **数据绑定**:Spring MVC支持JSON或XML格式的数据交换,jQuery可以通过Ajax请求发送和接收这些格式的数据...

    Spring MVC Cookbook(PACKT,2016).pdf

    11. **Ajax集成**:与JavaScript库(如jQuery)集成,实现异步请求和更新页面部分内容。 12. **模板引擎**:使用Thymeleaf或其他模板引擎动态生成HTML,提高代码的可读性和维护性。 13. **测试Spring MVC应用**:...

Global site tag (gtag.js) - Google Analytics