Java HTTP连接池是否有退出时间?可以设定吗?

Java HTTP连接池是否有退出时间?可以设定吗?,java,http,caching,connection,persistent,Java,Http,Caching,Connection,Persistent,持久连接的Java HTTP连接池在中进行了描述 . 但是,没有迹象表明,如果连接未被重用,是否会从缓存中退出,如果是,超时长度是多少 我发现的唯一参考是以下评论: keep-alive套接字会超时。如果服务器在HTTP头中发回超时,则会使用该超时值。否则,超时仅为5秒,在此之后套接字将不会被重用[…],不幸的是,您无法设置超时;它是在实现内部硬处理的 如果是真的,这将解释我们看到的一些奇怪的行为,我写了一个小测试用例,似乎证实了这一点。(在Windows上使用Java 1.6.20。) 有人知

持久连接的Java HTTP连接池在中进行了描述 . 但是,没有迹象表明,如果连接未被重用,是否会从缓存中退出,如果是,超时长度是多少

我发现的唯一参考是以下评论:

keep-alive套接字会超时。如果服务器在HTTP头中发回超时,则会使用该超时值。否则,超时仅为5秒,在此之后套接字将不会被重用[…],不幸的是,您无法设置超时;它是在实现内部硬处理的

如果是真的,这将解释我们看到的一些奇怪的行为,我写了一个小测试用例,似乎证实了这一点。(在Windows上使用Java 1.6.20。)


有人知道这方面的任何文件吗?此外,该评论已有几年历史。超时仍然是硬编码的,还是可以设置的?

听起来很合乎逻辑。网络属性的文档(您可以通过主API设置的属性除外)如下所示。AFAICT唯一可以设置的是是否使用keep alive以及到池的连接数

在Java7中,它们只在启动时被检查。在Java6文档中没有注意到这一点,但我认为这一定是文档的疏忽。因此,原则上,要关闭keepalive,您必须在命令行上以如下方式传递它:

java -Dhttp.keepalive=false ...
或使每台主机的池更小:

java -Dhttp.maxConnections=1 ...
您也可以尝试使用
System.setProperty()
,但这可能不起作用


了解这会导致什么问题是很有意思的,也许在某个地方可以找到解决方案?

老实说,每当我有这样的问题时,我都会直接查看源代码。大部分Java库源代码都可以在src.zip中找到,如果您想了解更深入的内容,可以深入到OpenJDK源代码中去了解。如果他们没有记录语义,那么可以使用源代码来发现“真正”发生了什么,尽管如果在以后的版本中更改这些假设,依赖系统的未记录方面显然是危险的。但至少你“知道”现在发生了什么,它本身并没有造成问题。我们刚刚看到应用程序中的http持久连接池对某些站点不起作用,但对其他站点起作用。然而,这似乎是我们的应用程序加上5秒驱逐时间的间接影响。对于某些站点,我们可以非常快速地发出多个HTTP请求,而对于其他站点,则会有延迟。由于不知道超时时间,我们认为可能存在网络问题或自动关闭连接。@ghirschhorn好的,我很确定您看到的就是这种行为。如果您需要更多的控制,那么唯一的选择似乎是使用原始套接字,这需要更多的工作。