Spring Boot 打开的文件太多;嵌套异常是java.net.套接字异常

bvhaajcl  于 2022-12-23  发布在  Spring
关注(0)|答案(1)|浏览(571)

在我当前的基于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

xbp102n0

xbp102n01#

这很奇怪,但最终我通过使用单例RestTemplate和单例RestTemplate构建器解决了这个问题。
当使用从rest template builder创建的新resttemplate示例时,它会为每个请求创建一些连接池,并且这些连接在默认情况下不会关闭。

相关问题