在我当前的基于Sping Boot 的项目中,我们在生产环境中遇到错误**“打开的文件太多;嵌套异常是java.net。套接字异常:“**
Too many open files; nested exception is java.net.SocketException: Too
many open files
java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:460)
at java.net.Socket.connect(Socket.java:587)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673)
at
sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
当我们使用resttemplate库对同一网络中的另一个基于微服务的rest API进行http调用时,会出现此错误。最近我们修改了resttemplate以在其中添加超时,我怀疑代码中可能存在一些问题。我在下面添加了bean定义逻辑/代码。如有任何帮助,将不胜感激。请注意,我已经引用了同一错误的另一个堆栈溢出问题,但没有帮助。
这里,我们restTemplate.exchange从调用者服务进行www.example.com方法调用,以便对另一个服务进行http调用。
问题:以下配置是否有问题?
我们调用这个方法来获取每个请求的resttemplate示例。还有一点需要注意的是,当我对所有请求使用restmlate的singleton或single instance时,这个问题就不再出现了。
public RestTemplate getRestTemplate(int timeoutMs) {
RestTemplate restTemplate = restTemplateBuilder.build();
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(timeoutMs);
clientHttpRequestFactory.setReadTimeout(timeoutMs);
restTemplate.setRequestFactory(clientHttpRequestFactory);
restTemplate.setInterceptors(Collections.singletonList(appClientInterceptor));
restTemplate.setErrorHandler(appClientErrorHanlder);
return restTemplate;
}
关于环境的一些细节如下:
Spring Boot 版本:1.5.8
Java版本:1.8
操作系统:Linux
1条答案
按热度按时间xbp102n01#
这很奇怪,但最终我通过使用单例RestTemplate和单例RestTemplate构建器解决了这个问题。
当使用从rest template builder创建的新resttemplate示例时,它会为每个请求创建一些连接池,并且这些连接在默认情况下不会关闭。