我想使用所谓的“自 Java 11 以来的新 HttpClient”
java.net.http.HttpClient
。
对我来说,确保在 HTTP 往返完成后关闭 TCP 连接是非常重要,以便释放相应的端口并释放资源。
API上没有
.close()
或 .disconnect()
或类似的内容。
无法关闭连接是非常奇怪的,而且也很奇怪为什么预期的行为(发生了什么?连接是否自动关闭?何时?如何?)从未在任何地方记录,包括 Java HTTP 客户端简介 和 示例和食谱 .
有什么建议吗?
这确实是一个缺失的功能,您必须等待 Java 21 才能明确关闭
HttpClient
。
请参阅错误报告 JDK-8304165,“支持通过使其自动关闭来关闭 HttpClient”:
使
实现java.net.http.HttpClient
以便尽早回收其资源(选择器、池中的空闲连接等),而不必等待 GC 对其进行垃圾收集。AutoCloseable
它的状态为“已批准”,修复版本为 21。您还可以使用 HttpClient
AutoCloseable
,因此具有 close
方法,该方法还表示“自:21 日起”。
最后,自 Java 21 LTS 以来,
java.net.http.HttpClient
现在是 AutoCloseable
,并且 以下方法已添加到 API 中:
void close()
- 优雅地关闭客户端,等待提交的请求完成;
void shutdown()
- 启动正常关闭,然后立即返回,无需等待客户端终止;
void shutdownNow()
- 发起立即关闭,尝试中断活动操作,并立即返回,无需等待客户端终止;
boolean awaitTermination(Duration duration)
- 等待客户端在给定的时间内终止;如果客户端终止则返回 true,否则返回 false;
boolean isTerminated()
- 如果客户端终止则返回 true。
HttpClient.newHttpClient()
返回的实例以及从HttpClient.newBuilder()
构建的实例为这些方法提供了尽力而为的实现。它们允许尽早回收由HttpClient
分配的资源,而无需等待其垃圾回收。
请注意,
HttpClient
实例通常管理自己的连接池,然后可以在必要时重用这些连接池。连接池通常不在HttpClient
实例之间共享。为每个操作创建一个新客户端虽然可能,但通常会阻止重用此类连接。