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

bejyjqdl  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(348)

我想使用所谓的“Java 11以来的新HttpClient”java.net.http.HttpClient
对我来说,确保TCP连接在HTTP往返完成后关闭是非常重要的,这样相应的端口就被释放,资源也被释放。
API上没有.close().disconnect()或类似的东西。
没有关闭连接的可能性是非常奇怪的,而且为什么预期的行为(* 发生了什么?连接会自动关闭吗?when?how?*)在任何地方都没有记录,包括Introduction to the Java HTTP ClientExamples and Recipes
有什么建议吗?

bq3bfh9z

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”。

xmakbtuz

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。

两个附加说明:

  1. HttpClient.newHttpClient()返回的示例和从HttpClient.newBuilder()构建的示例为这些方法提供了最佳实现。它们允许提前回收由HttpClient分配的资源,而无需等待其垃圾收集;
  2. HttpClient示例通常管理自己的连接池,然后在必要时可以重用这些连接池。连接池通常不在HttpClient示例之间共享。为每个操作创建一个新的客户端虽然是可能的,但通常会阻止重用这样的连接。

相关问题