Java 未关闭的httpclient是否有任何影响?

Java 未关闭的httpclient是否有任何影响?,java,spring-boot,tomcat8,apache-httpclient-4.x,apache-commons-httpclient,Java,Spring Boot,Tomcat8,Apache Httpclient 4.x,Apache Commons Httpclient,我们在ApacheTomcat8上部署JavaSpring引导应用程序,并尝试编写适当的java代码 但是我们有一个旧的、低流量的、不可维护的代码,它具有未关闭的CloseableHttpClient和CloseableHttpResponse CloseableHttpClient httpClient = HttpClients.custom().build(); try { CloseableHttpResponse response = httpClient.execute(t

我们在ApacheTomcat8上部署JavaSpring引导应用程序,并尝试编写适当的java代码

但是我们有一个旧的、低流量的、不可维护的代码,它具有未关闭的
CloseableHttpClient
CloseableHttpResponse

CloseableHttpClient httpClient = HttpClients.custom().build();

try  {
   CloseableHttpResponse response = httpClient.execute(target, post);

 ...(no finally clause)
根据apache的说法,虽然在演示中httpclient没有关闭,但两者都应该关闭:

CloseableHttpClient
      CloseableHttpClient httpclient = HttpClients.createDefault();
      ...
代码正在生产中工作,没有任何已知问题

我能知道不关闭这些资源的真正效果吗?这样才能知道修复这些资源的重要性

以下一项或多项是否可以处理/关闭这些http(使用代码或配置):


Tomcat/spring引导或其他以正确方式使用http客户端的代码?

取决于您的情况,通常在关闭服务器之前,您会一直保留您的http客户端。因为您使用的是SpringBoot,所以只需将其作为SpringBean注入即可。这也是一个很好的机会来配置超时之类的东西,其中一些默认为危险值(如0,这意味着无限),并将它们与您拥有的任何负载平衡器超时对齐

在这种情况下,关闭httpclient并不重要,因为它拥有的任何资源都将在应用程序退出时释放

但是,如果您是在需要的基础上创建它(为什么?)。根据您的设置方式,它可能会运行一些执行器,拥有一个连接池,等等。不清理这些执行器,然后重复创建更多的HttpClient,可能会导致文件句柄用完


这种bug的问题是,只有在文件句柄用完后,您才会知道自己有问题,这取决于您的服务器流量,可能需要很长一段时间。我曾经处理过由于未释放的文件句柄而导致的服务器崩溃,这种情况发生时很难调试。简言之,如果它有一个close方法并实现closable,那么最好有一个很好的理由不要在finally块或资源试用中调用它。

在tomcat上重新部署会导致问题。它可能有一个
finalize()
方法(检查源代码)使其工作正常。谢谢,您能详细介绍一下它对服务器的影响吗?影响平均负载或内存…?如果文件句柄用完,则服务器将处于死机状态,直到重新启动。在某些情况下,您甚至无法通过ssh连接到它(需要一个文件句柄)。