Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache HttpClient连接配置_Java_Connection Pooling_Apache Httpclient 4.x - Fatal编程技术网

Java Apache HttpClient连接配置

Java Apache HttpClient连接配置,java,connection-pooling,apache-httpclient-4.x,Java,Connection Pooling,Apache Httpclient 4.x,我正在尝试设置一个通过。我也看了一眼,这里开始出现混乱 在ConnectionManager或更确切地说,上,有以下方法: 关闭过期的连接 关闭空闲连接 连接何时被视为过期? 什么时候空闲? 当池中的连接关闭时会发生什么情况?是否确保在需要时重新创建连接?根据: HttpClient试图通过测试 连接“过时”,已关闭,因此不再有效 在服务器端,在使用连接执行 HTTP请求。陈旧连接检查不是100%可靠。这个 唯一可行的解决方案,不涉及每个套接字一个线程 空闲连接的模型是一个专用的监视线程,用

我正在尝试设置一个通过。我也看了一眼,这里开始出现混乱

在ConnectionManager或更确切地说,上,有以下方法:

  • 关闭过期的连接
  • 关闭空闲连接
连接何时被视为过期?
什么时候空闲?
当池中的连接关闭时会发生什么情况?是否确保在需要时重新创建连接?

根据:

HttpClient试图通过测试 连接“过时”,已关闭,因此不再有效 在服务器端,在使用连接执行 HTTP请求。陈旧连接检查不是100%可靠。这个 唯一可行的解决方案,不涉及每个套接字一个线程 空闲连接的模型是一个专用的监视线程,用于退出 由于长时间的连接而被视为已过期的连接 不活动。监视器线程可以定期调用 ClientConnectionManager#closeExpiredConnections()方法关闭所有 过期的连接并从池中收回已关闭的连接。它还可以选择调用ClientConnectionManager#closeIdleConnections()方法来关闭在给定时间段内处于空闲状态的所有连接


过期和空闲之间的区别在于,过期连接在服务器端已关闭,而空闲连接在服务器端不一定关闭,但在一段时间内处于空闲状态。当连接关闭时,它在池中再次可用。

HTTP基于TCP,它管理以正确顺序发送和接收包,并在包中途丢失时请求重新传输。TCP连接通过TCP握手开始,握手由
SYN
SYN-ACK
ACK
消息组成,而TCP连接则以
FIN
ACK-FIN
ACK
序列结束,这张图片取自

虽然HTTP是一种请求-响应协议,但打开和关闭连接的成本相当高,因此HTTP/1.1允许重用现有连接。使用标题
Connection:keep-alive
,即告诉客户端(即浏览器)保持与服务器的连接打开。一台服务器可以同时有成千上万个打开的连接。为了避免耗尽服务器的资源,通常会及时限制连接。通过套接字超时,空闲连接或存在某些连接问题的连接(断开的internet访问…)在一段预定义时间后由服务器自动关闭

许多HTTP实现,如ApacheHTTP client 4.4及更高版本,仅在连接即将使用时才检查连接的状态

在版本4.4中更改了过时连接的处理。以前,代码会在重新使用之前默认检查每个连接。该代码现在仅在自上次使用连接以来经过的时间超过已设置的超时时检查连接。默认超时设置为2000ms()

因此,如果某个连接可能有一段时间没有使用,则客户端可能没有从服务器读取
ACK-FIN
,因此,当服务器在一段时间前实际关闭该连接时,仍然认为该连接是打开的。这种连接已过期,通常称为半关闭。因此,可由池收集

请注意,如果发送包含
连接:close
HTTP头的请求,则应在客户端收到响应后立即关闭连接

打开连接的状态可以通过
netstat
进行检查,这在大多数现代操作系统中都应该存在。我最近不得不检查我们的一个HTTP客户机,该客户机是通过第三方库管理的,该库没有正确传播
连接:Close
头,因此导致大量半关闭的连接