自动关闭 HttpClient - Java 细品
Billy Korando 于 2023 年 12 月 10 日
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
对象被垃圾回收时释放。
其他阅读
编码愉快!