如何关闭HttpClient?为什么 API 中没有 .close() 方法?

问题描述 投票:0回答:2

我想使用所谓的“自 Java 11 以来的新 HttpClient”

java.net.http.HttpClient

对我来说,确保在 HTTP 往返完成后关闭 TCP 连接是非常重要,以便释放相应的端口并释放资源。

API
上没有
.close()
.disconnect() 或类似的内容。

无法关闭连接是非常奇怪的,而且也很奇怪为什么预期的行为(发生了什么?连接是否自动关闭?何时?如何?)从未在任何地方记录,包括 Java HTTP 客户端简介 示例和食谱 .

有什么建议吗?

java httpclient httpconnection
2个回答
6
投票

这确实是一个缺失的功能,您必须等待 Java 21 才能明确关闭

HttpClient

请参阅错误报告 JDK-8304165,“支持通过使其自动关闭来关闭 HttpClient”:

使

java.net.http.HttpClient
实现
AutoCloseable
以便尽早回收其资源(选择器、池中的空闲连接等),而不必等待 GC 对其进行垃圾收集。

它的状态为“已批准”,修复版本为 21。您还可以使用 HttpClient

早期访问文档进行验证,该文档显示它现在实现了 
AutoCloseable
,因此具有
close
方法
,该方法还表示“自:21 日起”。


0
投票

最后,自 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
 实例之间共享。为每个操作创建一个新客户端虽然可能,但通常会阻止重用此类连接。

© www.soinside.com 2019 - 2024. All rights reserved.