java耗时操作阻塞_spring boot高并发下耗时操作的实现方法

高并发下的耗时操作

高并发下,就是请求在一个时间点比较多时,很多写的请求打过来时,你的服务器承受很大的压力,当你的一个请求处理时间长时,这些请求将会把你的服务器线程耗尽,即你的主线程池里的线程将不会再有空闲状态的,再打过来的请求,将会是502了。

请求流程图

http1 http2 http3

thread1 thread2 thread3

解决方案

使用DeferredResult来实现异步的操作,当一个请求打过来时,先把它放到一个队列时,然后在后台有一个订阅者,有相关主题的消息发过来时,这个订阅者就去消费它,这一步可以是分布式的,比如一个秒杀场景,当N多的请求打过来时,有一些请求命中后,它们进行写操作,这时写操作压力很大,1个请求可以要处理3秒,对于高并发场景这是不能容许的,因为你这样占用的服务器线程资源太长了,很快你的服务器就没有可用的线程资源了,这时就可以用到DeferredResult这处理。

代码实现

建立订单的接口,只负责简单的校验和事件的发布

/**

* 异步建立高并发的订单.

*

* @return

*/

@GetMapping("/create-order")

public DeferredResult createOrder() {

DeferredResult deferredResult = new DeferredResult<>((long) 3000, "error order");

logger.info("发布建立订单的事件");

applicationEventPublisher.publishEvent(deferredResult);

return deferredResult;

}

异步的订单处理核心逻辑,也是耗时的操作

@Component

@EnableAsync

public class OrderListener {

static Logger logger = LoggerFactory.getLogger(OrderListener.class);

/**

* 事实上它是一个订单队列的消费者,在后台写订单,本例使用简单的事件监听器实现异步处理的功能.

*

* @return

*/

@EventListener

@Async

public String processOrder(DeferredResult deferredResult) throws InterruptedException {

logger.info("处理订单并返回到对应的Http上下文");

String order = UUID.randomUUID().toString();

Thread.sleep(2000);//假设处理数据需要5秒,前端需要阻塞5秒,但http主线程已经释放了,比较适合IO密集型场合

//当设置之后,create-order将成功响应

deferredResult.setResult(order);

return order;

}

}

测试结果

当请求/create-order后,服务器在处理2秒后,返回结果,而spring后台真正做的是,线程1在事件发布后,它成为空闲状态,其它请求可以复用它,当processOrder后台处理结果后,spring又会用线程池中拿一个新的线程处理剩下的逻辑!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中转义JSON字符串-Eclipse IDE技巧

在Java应用程序中工作或进行JSON解析时&#xff0c;通常很常见的做法是从某些资源&#xff08;例如RESTful Web服务&#xff09;中复制粘贴JSON字符串&#xff0c;然后使用Jackson库解析JSON。 这是测试和学习Java中解析JSON字符串的最快方法&#xff0c;但是这种方法的主要问题…

java hashmap实例_java HashMap详解及实例代码

java hashmap/** map集合的特点* 将键映射值的对象&#xff0c;一个映射不能包含重复的值&#xff1b;每个键最多只能映射到一个值** map集合和collection集合的区别&#xff1f;* map集合存储元素是成对出现的&#xff0c;map集合的键是唯一的&#xff0c;就是可重复的。可以把…

spring javafx_带有Spring的JavaFX 2

spring javafx我将从一个大胆的声明开始&#xff1a;我一直很喜欢Java Swing或applet。 在那里&#xff0c;我说了。 如果我进行一些自我分析&#xff0c;那么这种钦佩可能是在我接触Java时开始的。 Swing&#xff08;实际上&#xff09;是我使用Java所做的第一件事&#xff0c…

jframe和mysql登陆_刚写的一个从数据库读取账户和密码进行登陆的小程序~高手请无~...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.*; import javax.swing.*;public class LoginSystem extends JFrame{publi…

使用WebCrypto API的电子签名

有时我们需要让用户进行电子签名。 通常&#xff0c;人们会理解为将您的手写签名以某种方式放在屏幕上。 根据管辖范围&#xff0c;可能很好&#xff0c;或者仅存储图像可能还不够。 例如&#xff0c;在欧洲&#xff0c;有910/2014号法规 &#xff0c;该法规定义了什么是电子签…

mycat mysql 物理部署_一、MyCat的搭建

一、什么是mycat简单直接点就是&#xff0c;MyCat其实就是一个数据库的中间件&#xff01;一般我们都是app直接到数据库&#xff01;有了MyCat以后&#xff0c;就是app到MyCat然后再访问数据库。mycat是个中间件&#xff0c;它负责连接管理mysql,应用程序连接mycat,把mycat当作…

java 记事本换行_[求助]记事本自动换行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我编的一个记事本 自动换行该如何实现import java.io.*;import java.awt.*;import java.awt.event.*;import java.awt.print.*;public class Jishiben extends Frame implements ActionListener{FileDialog fileDlg;String str, f…

JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解

本文实例讲述了Java适配器模式应用之电源适配器功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一、模式定义存在两种适配器模式1 对象适配器模式&#xff0c;在这种适配器模式中&#xff0c;适配器容纳一个它包裹的类对象的物理实体。2 类适配器模式&#xff0c;…

java.util接口_函数接口– Java 8中java.util.function包中的函数接口

java.util接口我以前写过有关功能接口及其用法的文章。 如果您正在探索要成为Java 8一部分的API&#xff0c;尤其是那些支持lambda表达式的API&#xff0c;您会发现很少的接口&#xff0c;例如Function&#xff0c;Supplier&#xff0c;Consumer&#xff0c;Predicate和其他接口…

java new string作用_java中直接new String对象?

首先明确一点&#xff0c;在Java中比较的是两个对象的地址&#xff0c;equals()比较的是两个对象的值&#xff0c;如果使用equals()来替换&#xff0c;则两个输出结果都为true。言归正传&#xff0c;为什么第一个返回为false&#xff1f;先看一下intern()这个方法的描述&#x…

Apache Camel中的短重试与长重试

《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每个模式都基于真实的用例&#xff0c;并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉&#xff0c;以下是该书的重试模式摘录&#xff0c;其中介绍了如…

java注解的继承_Java注解合并,注解继承

spring中有时候一个类上面标记很多注解。实际上Java注解可以进行继承(也就是把多个注解合并成1个)比如说SpringMVC的注解RestControllerRequestMapping("/person")可以合并为一个PathRestController("/user")实现是&#xff1a;import java.lang.annotatio…

java实现驾校考试系统_jsp驾校考试系统

本驾校考试系统采用了Browser/Server体系结构&#xff0c;JSP(Java Server Page)作为前台开发工具&#xff0c;MySQL作为后台数据库进行开发。最终系统实现的系统将分为管理员和学员两个角色&#xff0c;其中系统管理员部分的主要功能包括修改登录密码、学员信息管理、科目1题目…

Java Maven和Gradle构建的主题缓存

Concourse CI 3.3.x引入了在任务运行之间缓存路径的功能。 此功能有助于加快将内容缓存在特定文件夹中的任务-在这里&#xff0c;我将演示如何使用此功能来加快基于Maven和Gradle的Java构建。 我在这篇文章中使用的代码和管道可以在我的github仓库中找到 – https://github.co…

java qlv转mp4 代码_怎么将qlv格式转换成mp4?教你快速转换视频格式的技巧

如何将qlv格式转换成mp4?众所周知qlv格式是腾讯视频的下载格式&#xff0c;而qlv格式的特点在于不能用别的播放器打开。如果用腾讯视频以外的播放器打开则需要将qlv格式转换成mp4&#xff0c;那你知道将qlv格式转换成mp4的技巧吗&#xff1f;下面小编教你一种转换qlv格式的技巧…

mysql导入竖杠分割的数据_MYSQL :逗号分隔串表,分解成竖表

DROP TEMPORARY TABLE IF EXISTS Temp_Num ;CREATE TEMPORARY TABLE Temp_Num ( xh INT PRIMARY KEY ); -- 创建数字辅助表SET i 0;INSERT INTO Temp_Num(xh) -- 写入数字辅助表SELECT i : i1FROM AdDataCenter.Ad_Targeting_Mobisage aLIMIT 0, 100 ;SELECT b.AdGroupID , SU…

maven 父maven_Maven的春天

maven 父maven1.概述 本教程将讨论如何使用Maven设置Spring&#xff0c;并介绍使用Spring依赖项的特定用例。 最新的Spring版本可以在Maven Central中找到。 2.基本的Maven Spring依赖关系 Spring的设计具有模块化和灵活性–基本的Spring容器可用于多种情况&#xff0c;而无需…

java中cell无法输出_java – iText 5.5.3 PDFPCell:长文本不适合单元格(不正确地包装文本)...

我正在尝试创建一个包含表格的波斯语PDF,我想写入它.当我的字符串很长时,它不能正确地适合单元格.感觉像字符串填充单元格颠倒&#xff01;…我的意思是,例如,当我想写“你好我的朋友.什么事情&#xff1f;”在单元格中输出如下&#xff1a;|这是怎么回事&#xff1f; ||我的朋…

emc存储java打开后报错_连接EMC存储系统 - osc_mk8rqvg4的个人空间 - OSCHINA - 中文开源技术交流社区...

1.准备一台笔记本电脑&#xff0c;一根网线即可。2.将网线一头连接笔记本电脑&#xff0c;另一头连接存储。(连接存储的一头应连接到有扳手图标的那一网口上)3.配置IP地址IP&#xff1a;128.221.1.254子网掩码&#xff1a;255.255.255.04.ping 128.221.1.250看是否能ping通&…

浙大JAVA实验题12_2019浙大计算机考研机试模拟赛(2)——概念专题

题目链接 引用自晴神OJA - 边覆盖B - 极大独立集C - 稳定婚姻问题D - 笛卡尔树没赶得上全程的比赛&#xff0c;就做了两道&#xff0c;后面两道以后有时间再补。两道都是概念题&#xff0c;比较基础~ 以下是题解A - 边覆盖Case Time Limit: 200 MS (Others) / 400 MS (Java) …