RestTemplate未使用线程池问题的解决方法
一、问题描述
【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]三、问题分析: 主动健康检查时,RestTemplate默认情况下不使用连接池,每次调用都会打开一个新的本地临时端口和一个新连接,如果通信异常,会导致连接不被回收,持续通信,它会不断新建线程,并且很快突破本地可用端口限制范围,导致服务卡死。
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连接池,设置ReadTimeout、ConnectTimeout超时时间,进行连接回收。
五、回归验证: 修改后,验证如下:
初始线程:
文章图片
测试3小时结束时线程:
文章图片
线程池线程未增加,状态交替
文章图片
到此这篇关于RestTemplate未使用线程池问题的解决方法的文章就介绍到这了,更多相关RestTemplate未使用线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Linux下面如何查看tomcat已经使用多少线程
- 多线程NSOperation
- spring|spring boot中设置异步请求默认使用的线程池
- Android中非UI主线程能不能操作UI()
- CountDownLatch-线程并发的发令枪
- 多线程的了解(上)
- 【转】深入分析java线程池的实现原理
- Python多线程编程——创建线程的两个方法
- linux监听蒲公英线程,重启
- java多线程-锁