Callable和DeferredResult都是springMVC里面的异步调用,Callable主要用来处理一些简单的逻辑,DeferredResult主要用于处理一些复杂逻辑

1.Callable的使用

github地址:https://github.com/showkawa/spring-annotation/blob/master/src/main/java/com/brian/async/Callable01.java

package com.brian.async;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import java.util.concurrent.Callable; /**
* SpringMVC异步调用 Callable =>执行过程
* 1.控制器返回Callable
* 2.Spring异步调用,将Callable提交到TaskExecutor使用一个隔离的线程进行执行
* 3.DispatcherServlet和所有的Filter退出web容器的线程,而response保持打开的状态
* 4.Callable返回结果,SpringMVC将请求重新派发给容器,并且恢复之前的处理。
* 5.根据Callable返回的结果。SpringMVC继续进行试图渲染流程等等等等。
*/
@Controller
public class Callable01 { @ResponseBody
@RequestMapping("/async01")
public Callable<String> async01() { System.out.println("主线程start...." + Thread.currentThread()+"-"+System.currentTimeMillis());
Callable<String> callable = new Callable<String>() { public String call() throws Exception {
System.out.println("callable线程start...." + Thread.currentThread() + "-" + System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("callable线程end...." + Thread.currentThread() + "-" + System.currentTimeMillis());
return "ok";
}
};
System.out.println("主线程end...." + Thread.currentThread()+"-"+System.currentTimeMillis());
return callable;
} }

2.DeferredResult的使用

github地址:https://github.com/showkawa/spring-annotation/blob/master/src/main/java/com/brian/async/DeferredResult02.java

package com.brian.async;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.async.DeferredResult; import java.util.UUID; /**
* DeferredResult异步调用
*
*/
@Controller
public class DeferredResult02 { @RequestMapping("/create")
public DeferredResult<Object> createOrder() {
DeferredResult<Object> deferredResult =
new DeferredResult<Object>((long)15000,"create order fail");
//存放到模拟的队列中
ResultQueue.add(deferredResult);
return deferredResult;
} @RequestMapping("/create/action")
public String createAction() {
DeferredResult<Object> deferredResult = ResultQueue.get();
String order = UUID.randomUUID().toString();
deferredResult.setResult(order);
return " create order id: " + order;
} }

SpringMVC异步调用,Callable和DeferredResult的使用的更多相关文章

  1. 使用Callable或DeferredResult实现springmvc的异步请求

    使用Callable实现springmvc的异步请求 如果一个请求中的某些操作耗时很长,会一直占用线程.这样的请求多了,可能造成线程池被占满,新请求无法执行的情况.这时,可以考虑使用异步请求,即主线程 ...

  2. 007-优化web请求三-异步调用【WebAsyncTask】

    一.什么是同步调用 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器都如此般处理.现在想想如果处理的过程中需要调用后端的一个业务逻辑服务 ...

  3. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  4. SpringMVC异步处理的 5 种方式

    作者:丁仪 来源:https://chengxuzhixin.com/blog/post/SpringMVC-yi-bu-chu-li-de-5-zhong-fang-shi.html 前段时间研究了 ...

  5. Spring Boot 异步请求和异步调用,一文搞定

    一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...

  6. Spring中@Async注解实现“方法”的异步调用

    原文:http://www.cnblogs.com/zhengbin/p/6104502.html 简单介绍: Spring为任务调度与异步方法执行提供了注解支持.通过在方法上设置@Async注解,可 ...

  7. Spring源码学习之:@async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的.    spring 在扫描be ...

  8. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  9. 5种必会的Java异步调用转同步的方法你会几种

    转载请注明本文地址:https://www.jianshu.com/p/f00aa6f66281 源码地址:https://gitee.com/sunnymore/asyncToSync Sunny先 ...

随机推荐

  1. POJ 1724 【存在附加约束的最短路问题】【优先队列】

    题意:给K个权值.给含有N个点,R条单向边的图. 每条边都有两个权值,其中一个路长,另外一个是附加权值. 要求路的附加权值之和不超过K的情况下求最短路. 思路: 自己的思路太狭隘,这题还是看了大牛的思 ...

  2. 2018.11.3 PION模拟赛

    期望:100    实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  3. iptables防火墙以及网络协议基本原理

    一. Linux 网络安全模型 1. 防火墙: 工作在主机或者网络边缘,对进出报文使用实现定义的规则进行检测,并且由匹配的规则进行处理的一组硬件或者软件.也可能两者结合. 1) 通常使用的防火墙设备 ...

  4. C++开发人脸性别识别教程(8)——搭建MFC框架之读取目录信息

    在上一篇博客中我们已经绘制了MFC界面,在这篇博客中我们将加入响应代码,为MFC框架加入一个最主要的功能:打开一个目录. 一.加入相关头文件 这里头文件主要包括三类:opencv头文件.批量读取文件相 ...

  5. Effective C++ Item 27 少做转型操作

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie todo Item34 旧式转型 (T) expression 或 T (expressio ...

  6. Java中常见的排序算法

    这是我摘取的一段英文资料.我认为学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At ...

  7. 【Mongodb教程 第十五课 】MongoDB 限制记录

    Limit() 方法 要限制 MongoDB 中的记录,需要使用 limit() 方法. limit() 方法接受一个数字型的参数,这是要显示的文档数. 语法: limit() 方法的基本语法如下 & ...

  8. python学习第一

    #python学习day1#一.变量#变量命名规范:#驼峰命名法:AgeOfPlane#下划线命名(推荐):age_of_plane#变量格式同C/C++#注意:变量不以中文命名:变量不宜过长:变量因 ...

  9. [IT学习]Linux 学习笔记

    1.踢掉用户 # who 15:23:13 up 26 days, 1:44, 2 users, load average: 0.00, 0.05, 0.03 USER TTY FROM LOGIN@ ...

  10. mongodb09----replicattion set--健壮性

    replication set复制集 replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性.一台是服务器出问题了另外2台还可以接收干,secondary平时保持只读状态, ...