高并发下restTemplate的错误分析方式
作者:逍遥散人tzp 发布时间:2023-08-23 12:58:24
高并发下restTemplate的错误分析
1. 问题现象和分析
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection
此问题很明显是连接等待超时,而且是从连接池中获取的连接。
那么就有一个很诧异的问题,这里哪来的连接池呢?然后我去跟踪restTemplate的源码发现,其底层是通过apache 的httpClient实现了连接池。那么问题就很明显了。就是在并发量高的时候,可能会出现连接池不够用。
2. 问题解决
既然分析出来是连接池不够了,那么我们在构建restTemplate的时候配置其底层的httpClient连接池大小,以便提高高并发的时候RestTemplate的性能。
可以通过配置总体最大连接池(maxConnTotal)和单个路由连接最大数(maxConnPerRoute),默认是(20,2)
maxConnTotal
是整个连接池的大小,根据自己的业务需求进行设置
maxConnPerRoute
是单个路由连接的最大数,可以根据自己的业务需求进行设置
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create()
.setMaxConnTotal(20)
.setMaxConnPerRoute(20)
.build());
httpRequestFactory.setConnectionRequestTimeout(10000);
httpRequestFactory.setConnectTimeout(10000);
httpRequestFactory.setReadTimeout(10000);
return new RestTemplate(httpRequestFactory);
}
这样就可以解决高并发下restTemplate连接池不够的问题。提高其性能,使得调用restTemplate的程序性能------>
使用restTemplate出现的异常
1.org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class zycf.cloud.bean.SafetyResponseType] and content type [text/html]
除了所有的答案之外,如果碰巧收到了text/html,而你期望别的东西(即 application/json)
则可能表明服务器端发生了错误(比如404)并且返回了错误页面而不是你的数据。
用postMan测试,果然是的,这个接口期望收到json数据,却收到了HTML页面
2.org.springframework.web.client.RestClientException: No HttpMessageConverter for java.util.HashMap and content type "multipart/form-data"
HashMap参数改为LinkedMultiValueMap
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("clientId",ZHEJIANG_CLIENT_ID );
params.add("nonce", uuid); //随机数
params.add("timestamp", dateString); //时间戳
params.add("signature", signature); //签名
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
/** 发送请求*/
RestTemplate restTemplate = new RestTemplate();
SafetyResponseType safetyResponseType = restTemplate.postForObject(SAFETY_CERTIFICATE_URL, requestEntity, SafetyResponseType.class );
采用这种方法反序列化的时候,如果json字符串中有相同的key,存的时候值会以数组的方式保存,
比如我们在做表单提交的时候,表单数据中可能存在键相同值不同的情况,可以用这种方法存值。
来源:https://blog.csdn.net/qq_29738509/article/details/89962112
猜你喜欢
- Android ListView的Item点击效果的定制
- 在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQue
- 一、问题描述有时候,我们会遇到在遍历List集合的过程中删除数据的情况。看着自己写的代码,感觉完全没有问题,但就是达不到预期的效果,这是为什
- 还原背景大家都做过b-s架构的应用,也就是基于浏览器的软件应用。现在呢有个场景就是FE端也就是前端工程是前后端分离的,采用主流的前端框架VU
- 基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。1. 分组有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下
- 本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下一、前言我们学了这么久的知识了,光学知识不会用是一件很悲伤
- using System.Xml;//初始化一个xml实例XmlDocument xml=new XmlDocument();//导入指定x
- Java 中的内部类这是一个 Java 内部类的简单实现:public class OutterJava { pr
- 一、Optional类的来源到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公
- 因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为 根据提供的模板来导出Excel报表并且可根据提供的模板S
- 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?我们考虑一个简单的赋值问题:in
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- 之前进行Web开发的时候使用的是myeclipse,但只用过的人都知道,由于其插件太多,而且有很多插件的功能根本就接触不到。所以导致一旦工程
- 自定义Starter命名规则注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starte
- 引言:关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽。上次突然一个同事问了我jav
- 介绍Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一
- 本文实例讲述了Java实现对两个List快速去重并排序操作。分享给大家供大家参考,具体如下:1:去重并排序package twolist;i
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- @ApiModel使用场景在实体类上边使用,标记类时swagger的解析类概述提供有关swagger模型的其它信息,类将在操作中用作类型时自
- Java作为一面向对象的语言,具备面向对象的三大特征——继承,多态,封装。继承顾名思义,继任,承接,传承的意思。面向对象的语言有一个好处,就