高并发下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


猜你喜欢
- 有时候我们需要判断栈顶的应用是否是我们的应用,于是获取栈顶的应用包名的需求就出现了。在android5.0之前,系统提供了一套API可以实现
- 目录介绍需求来源传统算法问题新算法特点性能数据效果“我”是什么适用范围能用多久★★集成建议★★常规集成大型分布式集成配置变更代码示例运行环境
- 前言dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池的参数可以通过配置中心配置进行动态的修改,在配
- idea中创建一个maven项目在pom文件中导入下面的依赖<!--mybatis核心包--> <depend
- 数据库表结构departmentemployee要求一现在的要求是输入 id 把 employee 表的对应员工数据查询出来,并且查询出该员
- W3C制定了XML DOM标准。很多编程语言中多提供了支持W3C XML DOM标准的API。我在之前的文章中介绍过如何使用Javascri
- 基于创蓝253短信服务平台的Java调用短信接口APIpackage com.bcloud.msg.http;import java.io.
- 本文实例为大家分享了C#使用Socket实现局域网聊天的具体代码,供大家参考,具体内容如下先运行一个java写的局域网聊天,效果图如下后使用
- 克隆方法是原型设计模式中必须使用的方式,它将返回一个与当前对象数据一致的对象。正如其名,犹如一个模子雕刻而出。克隆类型分为两种:浅克隆、深克
- Room在SQLite基础上做了ORM封装,使用起来类似JPA,不需要写太多的sql。导入依赖//roomdef room_version=
- 首先我们定义一个可以在运行时动态的找出项目的路径WebAppRootKey,这么做的原因是为了在后面配置log4j输出文件路径的时候能随心配
- Netty设置为Https访问SSLContextFactorypublic class SSLContextFactory {
- 详解微信小程序 同步异步解决办法小程序中函数体还没有完成,下一个函数就开始执行了,而且两个函数之间需要传参。那是因为微信小程序函数是异步执行
- 基本操作import org.apache.hadoop.conf.Configuration;import org.apache.hado
- 本文实例为大家分享了android surfaceView实现播放视频的具体代码,供大家参考,具体内容如下RelativeLayout<
- 关键点:将List内存储的对象实现Comparable类,重写它的compareTo()方法即可Bean:package chc;publi
- 1 问题实现任意view经过自定义带4圆角或者2圆角的效果2 原理1) 实现view 4圆角我们只需要把左边的图嵌入到右边里面去,最终显示左
- 用java压缩/解压文件: import java.io.*; import java.awt.*; import java.aw
- 前言前一段时间使用java来调用chatgpt的接口,然后写了一个简单小程序,java调用chatgpt接口,实现专属于自己的人工智能助手,
- 1. Dozer 介绍Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。D