Java 使用 RestTemplate 的 Timeout waiting for connection from pool 问题?

夜半 发布于 08/05 21:38
阅读 696
收藏 0

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

问题描述:

在公司服务器上 有一个调用三方的http接口(OCR)识别 接口:在处理过最大链接数请求之后 会一直提示超时:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://dm-58.data.aliyun.com/rest/160601/ocr/ocr_business_license.json": Timeout waiting for connection from pool; nested exception is org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

但是在线上服务器上curl -X POST 调用三方服务 提示正常;排除了网络请求问题

调用代码:

相关配置:

 

 

加载中
0
f
freezingsky

自己写个服务 ,自己post一下自己写的,不就可以确认了嘛

夜半
夜半
做过这个尝试,都是正常请求。这个三方返回的错误码 是占用的是http请求的code(通常提供的接口不论接口调用是否成功http请求都是200 ok)
0
伙哥
伙哥

这不就是httpclient连接池里的连接不够用了吗

伙哥
伙哥
回复 @夜半 : 不管返回的是什么code,resttemplate都会帮你释放掉连接,这个原因估计不是,确定发出新请求的时候原来的请求已经完成了吗
夜半
夜半
是的 初步怀疑使用连接池 对http请求code不是200的请求 没有释放掉
0
SpringBoot中文社区
SpringBoot中文社区

尝试从连接池获取链接异常??

夜半
夜半
对的 初步怀疑使用连接池 对http请求code不是200的返回状态码 没有释放掉 不过还没追踪到源码位置
0
ken6666
ken6666

好像请求消息头可以设置关闭

夜半
夜半
有设置 链接后关闭的策略 private ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context)
0
宋蒙蒙_show

看下请求的协议是Http1.0/1.1 , 响应后close需要调用

夜半
夜半
嗯 是的 调用spring-boot 的restTemplate理论上 会帮忙做这个事情
0
夜半
夜半

追加原因跟踪:确定是http链接没有释放的问题!

0
宗人府1992
宗人府1992

确认下是否配置了setConnectionTimeout和setTimeout,httpclient默认无限等待的

夜半
夜半
有的 是在RequestConfig里面配置的
返回顶部
顶部