如何在 Java 11 http 客户端中保持连接活动

qiG*_*uar 5 java http2 java-http-client java-11

我正在使用HttpClient带有 HTTP/2的 Java 11 ,需要保持连接活动几分钟,但构建器没有设置它的选项。有没有办法指定这一点并使客户端保持连接活动一段时间?

Rob*_*ert 11

如果您构建标准的 HttpClient,例如HttpClient.newHttpClient();默认情况下使用连接池创建。默认情况下,此池使连接保持活动状态 1200 秒(20 分钟)。

如果您想更改保持活动超时,您可以使用属性来实现jdk.httpclient.keepalive.timeout。但是,该值仅在类jdk.internal.net.http.ConnectionPool加载时读取一次。之后就不能再更改了。

因此,您必须为整个 JVM 设置此属性:

-Djdk.httpclient.keepalive.timeout=99999
Run Code Online (Sandbox Code Playgroud)

或者在ConnectionPool类加载之前的运行时:

System.setProperty("jdk.httpclient.keepalive.timeout", "99999");
Run Code Online (Sandbox Code Playgroud)

第三种选择是使用命名的文件${java.home}/conf/net.properties并在其中设置属性。

  • @Shubham它是从源“记录”的:https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.net.http/share/classes/jdk/internal/net/http/ConnectionPool。 java#L54-L57 (3认同)
  • @qiGuar 默认使用属性`jdk.httpclient.connectionPoolSize` 这个属性是`0`(未绑定) (2认同)
  • 让我试试!所以如果它是未绑定的,这意味着在每个请求中它都会创建新的连接吗?另外,是否有此信息的文档链接?非常感谢你的回答! (2认同)

dan*_*iel 2

默认情况下,HTTP/2 和 HTTP/1.1 连接均保持活动状态。当向同一主机打开多个并发连接时,存在一些例外情况 - 那么只有其中一个将保持活动状态。