SpringMVC与Servlet3.0整合实现异步处理

简介: SpringMVC与Servlet3.0整合实现异步处理

【1】Callable

① 概述


2018042016594056.png

其原理如下:


控制器返回Callable

Spring异步处理,将Callable 提交到 TaskExecutor 使用一个隔离的线程进行执行

DispatcherServlet和所有的Filter退出web容器的线程,但是response 保持打开状态;

Callable返回结果,SpringMVC将请求重新派发给容器,恢复之前的处理;

根据Callable返回的结果。SpringMVC继续进行视图渲染流程等(从收请求-视图渲染)。


② 代码示例

@ResponseBody
@RequestMapping("/async01")
public Callable<String> async01(){
  System.out.println("主线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  Callable<String> callable = new Callable<String>() {
    @Override
    public String call() throws Exception {
      System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
      Thread.sleep(2000);
      System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
      return "Callable<String> async01()";
    }
  };
  System.out.println("主线程结束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  return callable;
}


测试如下:


【2】DeferredResult


一旦启用了异步请求处理功能 ,控制器就可以将返回值包装在DeferredResult,控制器可以从不同的线程异步产生返回值。


优点就是可以实现两个完全不相干的线程间的通信。

① 创建一个存储DeferredResult的实例

public class DeferredResultQueue {
  private static Queue<DeferredResult<Object>> queue = new ConcurrentLinkedQueue<DeferredResult<Object>>();
  public static void save(DeferredResult<Object> deferredResult){
    queue.add(deferredResult);
  }
  public static DeferredResult<Object> get( ){
    return queue.poll();
  }
}

② 两个请求方法

@ResponseBody
@RequestMapping("/createOrder")
public DeferredResult<Object> createOrder(){
  DeferredResult<Object> deferredResult = new DeferredResult<>((long)3000, "create fail...");
  DeferredResultQueue.save(deferredResult);
  return deferredResult;
}
@ResponseBody
@RequestMapping("/create")
public String create(){
  //创建订单
  String order = UUID.randomUUID().toString();
  DeferredResult<Object> deferredResult = DeferredResultQueue.get();
  deferredResult.setResult(order);
  return "success===>"+order;
}

http://localhost:8080/springmvc-annotation/create请求创建order,并给deferredResult赋值。


http://localhost:8080/springmvc-annotation/createOrder请求获取order,有结果返回,超出等待时间返回创建失败。


目录
相关文章
|
8月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
126 0
|
8月前
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
854 0
|
6月前
|
前端开发 Java 应用服务中间件
Spring Boot 2.x 嵌入式 Servlet 容器
Spring Boot使用内嵌Tomcat,默认端口8080,可通过`application.properties`配置端口、上下文路径等。配置方式有两种:1) 直接在配置文件中添加`server.port`和`server.servlet.context-path`;2) 创建`WebServerFactoryCustomizer` Bean来自定义配置,如设置端口`factory.setPort(8083)`,这种方式优先级更高。
|
8月前
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
282 0
|
8月前
|
Java 应用服务中间件 数据库连接
Spring5源码(51)-Servlet知识点回顾以及SpringMVC分析入口
Spring5源码(51)-Servlet知识点回顾以及SpringMVC分析入口
79 0
|
8月前
|
XML Java 应用服务中间件
SpringMVC与Servlet3.0整合 - ServletContainerInitializer注解配置项目
SpringMVC与Servlet3.0整合 - ServletContainerInitializer注解配置项目
71 1
|
8月前
|
Java 数据库 容器
Servlet3.0中支持的异步处理
Servlet3.0中支持的异步处理
95 1
|
XML 前端开发 JavaScript
SpringMVC中单独配置<mvc:default-servlet-handler/> 导致 Controller失效
SpringMVC中单独配置<mvc:default-servlet-handler/> 导致 Controller失效
312 0
|
移动开发 前端开发 JavaScript
Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)
Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)
78 0
|
前端开发 Java Apache
Spring MVC-09循序渐进之文件上传(基于Servlet3.0+内置功能)
Spring MVC-09循序渐进之文件上传(基于Servlet3.0+内置功能)
88 0