我有一个缓慢的问题,当许多请求来到我的网站,它开始生成“等待”线程,我已经设置了休息模板作为一个Bean
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(Integer.parseInt(env.getProperty("service.configuration.http.http-request-timeout")))
.setReadTimeout(Integer.parseInt(env.getProperty("service.configuration.http.http-request-timeout")))
.requestFactory(clientHttpRequestFactory())
.build();
}
当我查找产生该问题的进程时,我发现HttpClient正在等待。
有人知道我该怎么做才能解决这个问题吗?
我使用**java8、Apache Tomcat、 Spring Boot **
3条答案
按热度按时间8hhllhi21#
在我过去的项目中,我使用了这种配置:
其中
cas
是以下对象的示例:通过这种方式,我可以配置httpclient以使用连接池,指定何时关闭空闲连接,并指定套接字超时、连接超时、连接请求超时
通过使用此配置,我不会再增加任何问题
我希望它能有用
安杰洛
w51jfk4q2#
一定是缺少超时的情况,应该尝试得到在您的情况下发生的确切问题,并更改导致该问题的设置。将RequestFactory更改为另一个库可能会也可能不会解决,这完全取决于问题-所以我的建议是首先确定它。例如:我们遇到了类似的问题,我们的线程在restTemplate中卡住了,所以我们进行了线程转储,如下所示
它清楚地表明原因是读取中缺少超时,因此我们添加了
同样,在你得到原因后,添加适当的超时
hm2xizp93#
HERE解释了发生这种情况的原因。
这个配置与Baeldung的另一篇关于rest template builder的文章是内联的。它看起来很好很干净,但是它隐藏了一个默认的PoolingHttpClientConnectionManager,其中defaultMaxPerRoute设置为5。这个默认的每个路由的最大值是什么意思?它意味着只有5个HTTP连接可以同时连接到同一个主机。
因此,您可以配置RestTemplate以使用池化实现,如HttpComponentsClientHttpRequestFactory,并覆盖
defaultMaxPerRoute
: