自动关闭 HttpClient - Java 细品

HttpClient 在 Java 21 中已更新为 AutoCloseable。让我们来看看吧!

自动关闭

AutoCloseable 不是一项新功能;它最初是在 JDK 7 中引入的,用于与 try-with-resources 语句一起使用。实现 AutoCloseable 的类提供了一个 close() 方法来释放和/或处置来自对象的底层资源,例如数据库连接或文件套接字。JDK 会在 try-with-resources 语句的标头中声明的资源完成时自动调用 close() 方法。这提供了更好的资源及时释放保证。

HttpClient 中的自动关闭

Java 错误系统 (JBS) 问题 JDK-8267140 定义了将 HttpClient 设为 AutoCloseable,这为 HttpClient 添加了五个新方法

  • void close():优雅地关闭客户端,等待已提交的请求完成。
  • void shutdown():启动优雅关闭,然后立即返回,而不等待客户端终止。
  • void shutdownNow():启动立即关闭,尝试中断活动操作,然后立即返回,而不等待客户端终止。
  • boolean awaitTermination(Duration duration):等待客户端终止,在给定的持续时间内;如果客户端已终止,则返回 true,否则返回 false
  • boolean isTerminated():如果客户端已终止,则返回 true

HttpClient.newHttpClient()HttpClient.newBuilder() 返回的 HttpClient 实例提供了对实现这些方法的最佳尝试。但是,如果需要不同的行为,则可以扩展 HttpClient,并覆盖方法来为您的需求提供更合适的行为。

正确关闭 HttpClient

在 JDK 21 之前,HttpClient 没有提供有关何时释放连接等资源的文档,这导致了对何时精确释放这些资源的混淆。这导致了 Stack Overflow 线程中的问题,以及像 Apache HttpClient 这样的第三方库实现了他们自己的 close() 方法。

为了清楚起见,HttpClient 的文档已更新,以详细说明其关闭连接的行为。此外,将 HttpClient 更新为 AutoClosable 应该会导致更及时地释放资源,因为资源应该在 try-with-resources 语句结束时释放,而不是在 HttpClient 对象被垃圾回收时释放。

其他阅读

HttpClient JDK 21 Javadoc

编码愉快!