HTTP1.1的鏈接,默認是長鏈接,不會主動關(guān)閉。
LINUX會默認保留鏈接5天再關(guān)閉。
建立HTTP鏈接其實也是調(diào)用TCL的協(xié)議去建立,包括開始的時候有三次握手,關(guān)閉的時候有四次握手。關(guān)閉鏈接雙方都可以發(fā)起。
但這些鏈接可能會被防火墻關(guān)掉而不通知建立鏈接的雙方,因此設(shè)置需設(shè)置鏈接的存活期。
使用httpClient的鏈接池時,要設(shè)置池中的鏈接存活期或設(shè)置存活策略。
檢測存活期只在每次發(fā)送數(shù)據(jù)時,才檢測取出的鏈接是否超過存活期,如超過則關(guān)閉。
設(shè)置存活期的策略:
import java.util.concurrent.TimeUnit;
import org.apache.http.HeaderElement;
import org.apache.http.HeaderElementIterator;
import org.apache.http.HttpResponse;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.message.BasicHeaderElementIterator;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.Args;
public class MyConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy{
private int timeToLive;
private TimeUnit timeUnit;
public MyConnectionKeepAliveStrategy(int timeToLive, TimeUnit timeUnit) {
this.timeToLive = timeToLive;
this.timeUnit = timeUnit;
}
@Override
public long getKeepAliveDuration(final HttpResponse response, final HttpContext context) {
Args.notNull(response, "HTTP response");
final HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
final HeaderElement he = it.nextElement();
final String param = he.getName();
final String value = he.getValue();
if (value != null && param.equalsIgnoreCase("timeout")) {
try {
return Long.parseLong(value) * 1000;
} catch(final NumberFormatException ignore) {
//do nothing
}
}
}
return timeUnit.toMillis(timeToLive);
}
}
《HttpClient官方文檔》2.6 連接維持存活策略
http://ifeve.com/httpclient-2-6/httpclient連接池管理,你用對了?
http://ifeve.com/http-connection-pool/HttpClient連接池的一些思考
https://zhuanlan.zhihu.com/p/85524697HTTP協(xié)議的Keep-Alive 模式
https://www.jianshu.com/p/49551bda6619