java - 未关闭httpclient有影响吗?

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

我们在 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 客户端的其他代码?

最佳答案

视情况而定,通常您会保留 httpclient,直到关闭服务器。由于您使用的是 spring boot,因此只需将其作为 spring bean 注入(inject)即可。这也是配置超时等内容的好机会,其中一些默认为危险值(例如 0,这意味着无限)并将其与您拥有的任何负载均衡器超时保持一致。

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

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

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

关于java - 未关闭httpclient有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49430790/

相关文章:

java - 在基于 JTable 面板的单元格编辑器中丢失第一个字符

java - 在 Spring Boot 应用程序之间传递文件/流

java - 如何启用 Ehcache 3.x JSR-107 MBean 操作?

java - 使用 Spring Boot 的 Resilience4J 断路器的 Bean 配置

java - 如何在现有的 Tomcat 安装中嵌入 OpenEJB

java - 无法在 Java 中启动 Tomcat

Java重载与继承方式选择

java - Kubernetes 资源版本太旧

java - 调用远程方法时出错

java - Tomcat 8.0.51 - 由于未知原因额外启动 20 秒