【问题标题】:Does unclosed httpclient have any effect?未关闭的httpclient有什么影响吗?
【发布时间】:2019-06-16 15:04:15
【问题描述】:

我们在 Apache tomcat 8 上部署 java spring boot 应用程序,并尝试编写适当的 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();
      ...

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

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

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

Tomcat/spring boot 或其他正确使用 http 客户端的代码?

【问题讨论】:

  • 在tomcat上重新部署会出问题
  • 它可能有一个 finalize() 方法(检查源代码),使它工作正常。

标签: java spring-boot tomcat8 apache-httpclient-4.x apache-commons-httpclient


【解决方案1】:

视情况而定,通常你会保留你的 httpclient 直到你关闭服务器。由于您使用的是 Spring Boot,因此只需将其作为 Spring Bean 注入即可。这也是配置诸如超时之类的东西的好机会,其中一些默认为危险值(例如 0,这意味着无限)并将它们与您拥有的任何负载均衡器超时对齐。

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

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

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

【讨论】:

  • 谢谢您,您能详细说明一下它对服务器的影响吗?平均效应负载还是内存...?
  • 如果你的文件句柄用完了,你的服务器会死掉,直到你重新启动它。在某些情况下,您甚至无法通过 ssh 进入它(需要文件句柄)。
猜你喜欢
  • 2017-07-04
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2014-10-05
相关资源
最近更新 更多