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

高并发下restTemplate的错误分析方式

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

标签:高并发,restTemplate
0
投稿

猜你喜欢

  • Android使用setContentView实现页面的转换效果

    2021-07-30 15:13:32
  • Java简易学生成绩系统写法实例

    2021-08-18 08:06:03
  • Android自定义View接收输入法输入的内容

    2022-08-28 12:25:42
  • Spring事务管理方法步骤解析

    2021-12-15 20:09:04
  • C#实现简单的聊天窗体

    2022-11-09 03:25:13
  • C# 实现dataGridView选中一行右键出现菜单的示例代码

    2022-05-12 05:15:55
  • Java spring AOP基础

    2022-08-10 12:39:25
  • MyBatis实现多表联合查询resultType的返回值

    2023-03-11 22:25:37
  • 解决Android studio模拟器启动失败的问题

    2022-06-12 00:55:01
  • 用C#实现启动另一程序的方法实例

    2023-06-20 12:05:43
  • Android string.xml中的替换方法

    2021-11-10 11:47:56
  • Android Studio工程导入及坑的解决

    2022-01-12 20:48:31
  • Java通过jersey实现客户端图片上传示例

    2022-09-17 15:44:24
  • C语言字符串大小比较

    2022-06-02 14:15:17
  • C#访问SqlServer设置链接超时的方法

    2022-11-19 17:43:21
  • 详解Java利用同步块synchronized()保证并发安全

    2021-09-12 12:15:07
  • Android定时器和倒计时实现淘宝秒杀功能

    2023-01-18 02:17:04
  • springmvc 中dao层和service层的区别说明

    2022-07-26 00:55:41
  • Android SearchView搜索框组件的使用方法

    2023-06-25 08:13:42
  • Android5.0新控件实例详解

    2022-12-06 21:58:18
  • asp之家 软件编程 m.aspxhome.com