Spring及Springboot 异步请求
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 异步请求相关推荐
- SpringBoot异步请求
何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...
- 详解Spring框架的异步请求
文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...
- spring mvc对异步请求的处理
在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...
- Spring Boot 异步请求和异步调用
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.Spring Boot中异步请求的使用 1.异步请求与同步请求 ...
- Spring Boot 异步请求和异步调用,一文搞定!
一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...
- springboot服务调用超时_Spring Boot 异步请求和异步调用,一文搞定
一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...
- SpringBoot异步调用方法
SpringBoot异步调用方法 一.spring boot--使用异步请求,提高系统的吞吐量 https://blog.csdn.net/liuchuanhong1/article/details/ ...
- java异步处理_SpringBoot异步开发之异步请求,在高并发的情况下,提高性能
何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...
- 面试官 | SpringBoot 中如何实现异步请求和异步调用?
作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...
最新文章
- linux 消息对lie_Linux进程间通信之消息队列总结
- DISCUZ 使用 JQ做效果导致DIY失效的解决办法
- python统计各分数段人数并可根据选择绘制不同的图形_python习题整理
- 币安Binance API
- 计算机学院方阵入场词,学校运动会方阵入场解说词
- 在android studio开发中,关于绘制GifView异常,硬件加速问题的解决办法
- 高精度温度采集系统设计
- android webview 设置下载文件,Android WebView使用之文件下载
- 搭建简单的企业网站,华为云速建站和阿里建站哪个好?
- 面试相关(技术汇总)
- 30行Python代码实现蚂蚁森林自动偷能量
- 计算机桌面进入安全模式,win7安全模式无法入桌面怎么办?无法进入桌面解法...
- Centos7为yum设置代理
- 模拟手机预览(非F12)
- 驾考题库API接口,免费好用
- 超详细!linux系统nlg-eval安装指南
- Qt打开指定目录并选中指定文件
- 计算机语言真假的意思,c语言中1和0是真假的意思吗
- Lab6 MPEG音频编码实验——C++代码实现
- html设计动画小黄人,纯CSS3画出小黄人并实现动画效果_html/css_WEB-ITnose
热门文章
- (四)WAVE协议的802.11p与802.11a主要区别MAC/PHY
- html静态模板继承,Django框架(七)-- 模板层:模板导入、模板继承、静态文件...
- linux系统上传本地文件或文件夹
- uniapp小程序接入快递100第三方插件api
- 计算机比较实用的知识,电脑小知识:最常用的10个电脑技巧
- windows下的Handle句柄和Linux下的Fd文件标示符
- 你谈谈计算机图形学未来发展,计算机图形学
- ffmpeg云服务器推流
- 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...
- linux tcptraceroute tcpping安装使用