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

 更新时间:2021年10月29日 10:20:30   作者:逍遥散人tzp  
这篇文章主要介绍了高并发下restTemplate的错误分析方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

高并发下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,存的时候值会以数组的方式保存,

比如我们在做表单提交的时候,表单数据中可能存在键相同值不同的情况,可以用这种方法存值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中的声明式事务+切面事务+编程式事务详解

    SpringBoot中的声明式事务+切面事务+编程式事务详解

    这篇文章主要介绍了SpringBoot中的声明式事务+切面事务+编程式事务详解,事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性,需要的朋友可以参考下
    2023-08-08
  • Java对数器验证算法详解

    Java对数器验证算法详解

    这篇文章主要介绍了Java对数器验证算法,Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差。但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了
    2023-04-04
  • java高并发的线程中断的几种方式详解

    java高并发的线程中断的几种方式详解

    这篇文章主要介绍了Java线程中断机制几种方法及示例,向大家分享了这几种方法的介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
    2021-10-10
  • SpringBoot实现网站的登陆注册逻辑记录

    SpringBoot实现网站的登陆注册逻辑记录

    登陆注册功能是我们日常开发中经常遇到的一个功能,下面这篇文章主要给大家介绍了关于SpringBoot实现网站的登陆注册逻辑的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 复杂JSON字符串转换为Java嵌套对象的实现

    复杂JSON字符串转换为Java嵌套对象的实现

    这篇文章主要介绍了复杂JSON字符串转换为Java嵌套对象的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java实现合并两个已经排序的列表实例代码

    java实现合并两个已经排序的列表实例代码

    这篇文章主要介绍了java实现合并两个已经排序的列表实例代码,有需要的朋友可以参考一下
    2013-12-12
  • Java中如何用Stream分组并求各组数量

    Java中如何用Stream分组并求各组数量

    这篇文章主要给大家介绍了关于Java中如何用Stream分组并求各组数量的相关资料,文中通过实例代码,对大家学习或者Java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 利用spring AOP记录用户操作日志的方法示例

    利用spring AOP记录用户操作日志的方法示例

    这篇文章主要给大家介绍了关于利用spring AOP记录用户操作日志的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • java使用正则表达式过滤html标签

    java使用正则表达式过滤html标签

    本篇文章主要介绍了java正则表达式过滤html标签,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java中gc算法实例用法

    java中gc算法实例用法

    在本篇文章里小编给大家整理了一篇关于java中gc算法实例用法,有兴趣的朋友们可以参考学习下。
    2021-01-01

最新评论