RestTemplate未使用线程池问题的解决方法

 更新时间:2021年06月22日 14:19:29   作者:zetor_major  
今天给大家带来的是关于Springboot的相关知识,文章围绕着RestTemplate未使用线程池展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

一、问题描述

现场出现springboot服务卡死,无法打开页面现象。

初步分析为服务中使用RestTemplate通信框架,但未使用连接池,如果通信抛出异常(连接失败),连续运行一定时间,导致线程飙升,资源耗尽,服务程序宕机。

二、问题再现

模拟无法通信的微服务地址,修改连接2s/次,启动三个微服务demo进行通信,连续测试2小时,现象可再现:

详细如下图:

启动时线程数:

连接异常提示:

线程飙升:

大量未关闭线程:

线程dump信息:

"http-nio-8081-exec-120" #216 daemon prio=5 os_prio=0 tid=0x000000002b0f9800 nid=0x4a28 runnable [0x0000000030349000]
   java.lang.Thread.State: RUNNABLE
       at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    …
       at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:737)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:672)
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:313)

三、问题分析:

主动健康检查时,RestTemplate默认情况下不使用连接池,每次调用都会打开一个新的本地临时端口和一个新连接,如果通信异常,会导致连接不被回收,持续通信,它会不断新建线程,并且很快突破本地可用端口限制范围,导致服务卡死。

四、解决方案:

使用RestTemplate连接池,设置ReadTimeout、ConnectTimeout超时时间,进行连接回收。

五、回归验证:

修改后,验证如下:

初始线程:

测试3小时结束时线程:

线程池线程未增加,状态交替

到此这篇关于RestTemplate未使用线程池问题的解决方法的文章就介绍到这了,更多相关RestTemplate未使用线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java类中static{}的具体使用

    Java类中static{}的具体使用

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,本文主要介绍了Java类中static{}的具体使用,感兴趣的可以了解一下
    2024-07-07
  • 详解springboot配置多个redis连接

    详解springboot配置多个redis连接

    Spring Boot为Redis, MongoDB, Elasticsearch, Solr和Gemfire提供自动配置。本文详细介绍了springboot配置多个redis连接,有兴趣的可以了解一下。
    2017-04-04
  • java实现创建缩略图、伸缩图片比例生成的方法

    java实现创建缩略图、伸缩图片比例生成的方法

    这篇文章主要介绍了java实现创建缩略图、伸缩图片比例生成的方法,可实现针对图片大小的缩放功能,是Java针对图片操作的典型应用,需要的朋友可以参考下
    2014-11-11
  • Springboot如何操作redis数据

    Springboot如何操作redis数据

    这篇文章主要介绍了Springboot如何操作redis数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 解决RedisTemplate调用increment报错问题

    解决RedisTemplate调用increment报错问题

    这篇文章主要介绍了解决RedisTemplate调用increment报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • java ssm框架的controller实现向页面传递参数

    java ssm框架的controller实现向页面传递参数

    这篇文章主要介绍了java ssm框架的controller实现向页面传递参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
    2023-04-04
  • Spring Boot使用Spring的异步线程池的实现

    Spring Boot使用Spring的异步线程池的实现

    这篇文章主要介绍了Spring Boot使用Spring的异步线程池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 详述IntelliJ IDEA插件的安装及使用方法(图解)

    详述IntelliJ IDEA插件的安装及使用方法(图解)

    本篇文章主要介绍了详述 IntelliJ IDEA 插件的安装及使用方法(图解),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Spring详解四种加载配置项的方法

    Spring详解四种加载配置项的方法

    这篇文章主要给大家介绍了关于springboot加载配置项的四种方式,文中通过示例代码介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2022-06-06

最新评论