PoolingHttpClientConnectionManager 如何管理连接?
How PoolingHttpClientConnectionManager manage connections?
我有一个问题 What is httpconnection of PoolingHttpClientConnectionManager?.
我知道如果我们使用 PoolingHttpClientConnectionManager
,它会减少建立连接的时间(例如 ssl handshake
, tcp enter code herehandshake
等),因为它会重用连接。
不过,我对http连接重用的理解是keep-alive,当服务器支持时我们可以使用它。如果主机不支持keep-alive连接,我们将无法与带keep-alive的主机通信。
所以,这是我的问题,
如果我使用 PoolingHttpClientConnectionManager 来管理非 keep-alive 服务器环境中的连接,
Connectionmanager 管理连接吗?或者它根据请求创建连接?
如果ConnectionManager管理连接,ConnectionManager如何保持连接?管理器是否定期发送字节?
如果您不定义 HttpClient 将充当连接可以无限期保持活动状态,来自 Apache http docs:
If the Keep-Alive header is not present in the response, HttpClient
assumes the connection can be kept alive indefinitely.
如果您想定义 Keep-Alive 策略,请参阅 example:
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
HeaderElementIterator it = new BasicHeaderElementIterator
(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
HeaderElement he = it.nextElement();
String param = he.getName();
String value = he.getValue();
if (value != null && param.equalsIgnoreCase
("timeout")) {
return Long.parseLong(value) * 1000;
}
}
return 5 * 1000;
}
};
我有一个问题 What is httpconnection of PoolingHttpClientConnectionManager?.
我知道如果我们使用 PoolingHttpClientConnectionManager
,它会减少建立连接的时间(例如 ssl handshake
, tcp enter code herehandshake
等),因为它会重用连接。
不过,我对http连接重用的理解是keep-alive,当服务器支持时我们可以使用它。如果主机不支持keep-alive连接,我们将无法与带keep-alive的主机通信。
所以,这是我的问题,
如果我使用 PoolingHttpClientConnectionManager 来管理非 keep-alive 服务器环境中的连接, Connectionmanager 管理连接吗?或者它根据请求创建连接?
如果ConnectionManager管理连接,ConnectionManager如何保持连接?管理器是否定期发送字节?
如果您不定义 HttpClient 将充当连接可以无限期保持活动状态,来自 Apache http docs:
If the Keep-Alive header is not present in the response, HttpClient assumes the connection can be kept alive indefinitely.
如果您想定义 Keep-Alive 策略,请参阅 example:
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
HeaderElementIterator it = new BasicHeaderElementIterator
(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
HeaderElement he = it.nextElement();
String param = he.getName();
String value = he.getValue();
if (value != null && param.equalsIgnoreCase
("timeout")) {
return Long.parseLong(value) * 1000;
}
}
return 5 * 1000;
}
};