1.java 异步请求

Spring在3.2的版本上就已经为我们提供的相应的机制,以应对Http Nio的场景。

官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持。

  •  *简单来说就是一个请求进来,如果你使用了DeferredResult或者Callable,在没有得到返回数据之前, DispatcherServlet和所有Filter就会退出Servlet容器线程,但响应保持打开状态, 一旦返回数据有了,这个DispatcherServlet就会被再次调用并且处理,以异步产生的方式,向请求端返回值。
    

2.异步请求实现方式

 1. Callable加SpringMvc 自带线程池,可以对SpringBoot 默认创建的ThreadPoolTaskExecutor 进行覆写,按照业务需求定义线程池
 /*** 1.使用 springboot 自动生成的ThreadPoolTaskExecutor 线程池* @param request* @param name* @return*/@GetMapping("/test1")@ResponseBodypublic  Callable<String> test1(HttpServletRequest request,@RequestParam (required = true) String name){log.info("--------start-----");Callable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);log.info("当前线程名" + Thread.currentThread().getName());return "hello" + name + "访问 test1";}};log.info("--------end-----");return callable;}## 覆写 mvc 线程池```java
@Configuration
@ConfigurationProperties(prefix = "web-mvc-async")
public class WebMvcConfig extends WebMvcConfigurationSupport {@Overridepublic void configureAsyncSupport(final AsyncSupportConfigurer configurer) {configurer.setDefaultTimeout(60 * 1000L);configurer.registerCallableInterceptors(timeoutInterceptor());configurer.setTaskExecutor(threadPoolTaskExecutor());}@Beanpublic TimeoutCallableProcessingInterceptor timeoutInterceptor() {return new TimeoutCallableProcessingInterceptor();}@Beanpublic ThreadPoolTaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor t = new ThreadPoolTaskExecutor();t.setCorePoolSize(2);t.setMaxPoolSize(3);t.setQueueCapacity(1024);t.setThreadNamePrefix("My-Mvc-Thread-");t.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //在调用线程,即主线程执行return t;}
}

使用自定义线程池和Future 方式


private static final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(cpuNum, cpuNum * 2, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024));/*** 使用配置bean 自定义线程池,返回submit.get() 要放到最后一行,不阻塞主线程* @param request* * */
@GetMapping("/test2")@ResponseBodypublic  String test2(HttpServletRequest request,@RequestParam (required = true) String name)throws ExecutionException, InterruptedException {log.info("--------start2-----");Future<String> submit = threadPoolExecutor.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);log.info("当前线程名" + Thread.currentThread().getName());return "hello" + name + "访问 test2";}});log.info("--------end2-----");return submit.get();}
对于没有返回值得任务来说可以使用自定义线程池,也可以使用@Async 异步注解

Spring及Springboot 异步请求相关推荐

  1. SpringBoot异步请求

    何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...

  2. 详解Spring框架的异步请求

    文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...

  3. spring mvc对异步请求的处理

    在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...

  4. Spring Boot 异步请求和异步调用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.Spring Boot中异步请求的使用 1.异步请求与同步请求 ...

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

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

  6. springboot服务调用超时_Spring Boot 异步请求和异步调用,一文搞定

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

  7. SpringBoot异步调用方法

    SpringBoot异步调用方法 一.spring boot--使用异步请求,提高系统的吞吐量 https://blog.csdn.net/liuchuanhong1/article/details/ ...

  8. java异步处理_SpringBoot异步开发之异步请求,在高并发的情况下,提高性能

    何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...

  9. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

最新文章

  1. linux 消息对lie_Linux进程间通信之消息队列总结
  2. DISCUZ 使用 JQ做效果导致DIY失效的解决办法
  3. python统计各分数段人数并可根据选择绘制不同的图形_python习题整理
  4. 币安Binance API
  5. 计算机学院方阵入场词,学校运动会方阵入场解说词
  6. 在android studio开发中,关于绘制GifView异常,硬件加速问题的解决办法
  7. 高精度温度采集系统设计
  8. android webview 设置下载文件,Android WebView使用之文件下载
  9. 搭建简单的企业网站,华为云速建站和阿里建站哪个好?
  10. 面试相关(技术汇总)
  11. 30行Python代码实现蚂蚁森林自动偷能量
  12. 计算机桌面进入安全模式,win7安全模式无法入桌面怎么办?无法进入桌面解法...
  13. Centos7为yum设置代理
  14. 模拟手机预览(非F12)
  15. 驾考题库API接口,免费好用
  16. 超详细!linux系统nlg-eval安装指南
  17. Qt打开指定目录并选中指定文件
  18. 计算机语言真假的意思,c语言中1和0是真假的意思吗
  19. Lab6 MPEG音频编码实验——C++代码实现
  20. html设计动画小黄人,纯CSS3画出小黄人并实现动画效果_html/css_WEB-ITnose

热门文章

  1. (四)WAVE协议的802.11p与802.11a主要区别MAC/PHY
  2. html静态模板继承,Django框架(七)-- 模板层:模板导入、模板继承、静态文件...
  3. linux系统上传本地文件或文件夹
  4. uniapp小程序接入快递100第三方插件api
  5. 计算机比较实用的知识,电脑小知识:最常用的10个电脑技巧
  6. windows下的Handle句柄和Linux下的Fd文件标示符
  7. 你谈谈计算机图形学未来发展,计算机图形学
  8. ffmpeg云服务器推流
  9. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...
  10. linux tcptraceroute tcpping安装使用