我想使用所谓的“Java 11以来的新HttpClient”java.net.http.HttpClient
。
对我来说,确保TCP连接在HTTP往返完成后关闭是非常重要的,这样相应的端口就被释放,资源也被释放。
API上没有.close()
或.disconnect()
或类似的东西。
没有关闭连接的可能性是非常奇怪的,而且为什么预期的行为(* 发生了什么?连接会自动关闭吗?when?how?*)在任何地方都没有记录,包括Introduction to the Java HTTP Client和Examples and Recipes。
有什么建议吗?
2条答案
按热度按时间bq3bfh9z1#
这确实是一个缺失的功能,您必须等待Java 21能够显式关闭
HttpClient
。参见bug报告JDK-8304165,“Support closing the HttpClient by making it auto-closable”:
让
java.net.http.HttpClient
实现AutoCloseable
,以便能够尽早回收其资源(选择器、池中的空闲连接等),而不必等待GC对其进行垃圾收集。它的状态为“已批准”,并修复版本21。您还可以使用early access documentation of
HttpClient
进行验证,这表明它现在实现了AutoCloseable
,因此有一个close
方法,该方法也说“Since:21”。xmakbtuz2#
最后,从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
示例之间共享。为每个操作创建一个新的客户端虽然是可能的,但通常会阻止重用这样的连接。