[英]Apache HttpClient TCP Keep-Alive (socket keep-alive)
[英]How to add Keep-Alive header for server based on Apache HttpComponents?
仅在连接要持久的情况下,才如何使用Apache HttpComponents将“ Connection:Keep-Alive”和“ Keep-Alive:timeout = x,max = y”标头添加到响应中?
如果HttpComponents决定此连接将不会持久,则在响应后添加“ Connection:close”标头。 在这种情况下,我不需要Keep-Alive标头。
为什么我这样做:
对于HttpComponents,标准行为是对持久连接的响应不做任何更改,对于非持久连接则添加“ Connection:close”。 在大多数情况下,此方法效果很好。
我想要一个Keep-Alive标头,因为基于标准java.net.HttpURLConnection的客户端将在不活动5秒后超时并丢弃连接,除非服务器先前的响应中没有Keep-Alive标头。 我想使用Keep-Alive定义比5秒更长的超时时间。
您可以根据响应来自org.apache.http.protocol.ResponseConnControl的评估将HttpResponseInterceptor添加到响应中,以添加“ Connection:Keep-Alive”和“ Keep-Alive:timeout = x,max = y”标头,连接:在需要时关闭“”标题。
class ResposeKeepAliveHeaderMod implements HttpResponseInterceptor {
@Override
public void process(HttpResponse response, HttpContext context)
throws HttpException, IOException {
final Header explicit = response.getFirstHeader(HTTP.CONN_DIRECTIVE);
if (explicit != null && HTTP.CONN_CLOSE.equalsIgnoreCase(explicit.getValue())) {
// Connection persistence explicitly disabled
return;
}else{
// "Connection: Keep-Alive" and "Keep-Alive: timeout=x, max=y"
response.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE);
response.setHeader(HTTP.CONN_KEEP_ALIVE, "timeout=30, max=100");
}
}
}
您需要在ResponseConnControl之后将其添加到HttpProcessor中:
HttpProcessor httpProcessor = HttpProcessorBuilder.create()
//.addFirst(new RequestTrace())
.add(new ResponseDate())
//.add(new ResponseServer("MyServer-HTTP/1.1"))
.add(new ResponseContent())
.add(new ResponseConnControl())
.addLast(new ResposeKeepAliveHeaderMod())
.build();
然后构建服务器:
final HttpServer server = ServerBootstrap.bootstrap()
.setListenerPort(9090)
.setHttpProcessor(httpProcessor)
.setSocketConfig(socketConfig)
.setExceptionLogger(new StdErrorExceptionLogger ())
.setHandlerMapper(handle_map)
.create();
我没有尝试过,但是看来您可以为您的httpCleint编写自定义的“ ConnectionKeepAliveStrategy”。 这是文档HttpComponents自定义策略
请参阅第2.11节
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.