未关闭的httpclient有什么影响吗?

Does unclosed httpclient have any effect?

我们在 Apache tomcat 8 上部署 java spring 启动应用程序,我们尝试编写适当的 java 代码。

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

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

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

 ...(no finally clause)

根据 apache 当然两者都应该关闭,尽管在 quickstart 演示中 httpclient 没有关闭:

CloseableHttpClient
      CloseableHttpClient httpclient = HttpClients.createDefault();
      ...

代码正在投入生产,没有任何已知问题。

我能知道不关闭此类资源的真正影响,以便了解修复的重要性吗?

以下一项或多项可能 handle/close 那些 http(使用代码或配置):

Tomcat/spring 启动或以正确方式使用 http 客户端的不同代码?

视情况而定,通常您会保留 httpclient,直到您关闭服务器。由于您正在使用 spring 引导,只需将其作为 spring bean 注入即可。这也是配置超时之类的好机会,其中一些默认为危险值(如 0,这意味着无限)并将它们与您拥有的任何 load-balancer 超时对齐。

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

但是如果您是根据需要创建它(为什么?),您可能想要关闭它。根据您的设置方式,它可能 运行 一些执行程序,有一个连接池等。不清理它然后重复创建更多 httpclients,可能会导致您 运行文件句柄。

这种 bug 的问题在于,只有在 运行 文件句柄用完之后,您才会知道自己遇到了问题,这取决于您的服务器流量,这可能需要相当长的一段时间。我处理过由于未发布的文件句柄而导致服务器崩溃的问题,当它发生时很难调试。简而言之,如果它有一个 close 方法并实现了 closable,你最好有充分的理由不要在 finally 块或尝试使用资源时调用它。