我使用的是tomcat 8.x的tomee 7.1.0,我试图在poc应用程序中实现http连接池的概念。我编写了简单的rest服务,并将其部署到本地机器中。休息服务启动并运行。
我用apache http客户端和http池编写了一个简单的客户端程序,它连接我的本地web服务,能够连接并且运行良好。
PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager();
pool.setDefaultMaxPerRoute(5);
pool.setMaxTotal(5);
final CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(pool).build();
final String url = "http://localhost:8080/healthz";
我用过
https://huongdanjava.com/create-and-use-http-client-connection-pool.html
示例代码,并使用netstat命令验证客户端的池连接数。很好。
按照keep alive的概念,客户端请求头应该有连接:keep alive和服务器响应头应该提供连接:keep alive然后相同的连接可以重复使用,否则它不能是相同的连接。
我可以在客户机请求头中看到keep alive值,但是在响应中没有keep alive值,那么apache客户机如何重用连接。但是apache客户端有5个连接。我已经用netcat验证过了。
我已经使用jmx(catalina,线程池->http:8080)验证了tomcat open连接,它显示连接计数为1,keepalivecount=0。这些是默认值。Tomcat中没有5个已打开连接的标记。
我的问题
-
apache http客户端有5个连接,tomcat服务器没有显示任何连接。如何在tomcat中检查打开的连接?
-
如果没有来自服务器响应头的keep alive值,客户端如何将这些连接保持为池连接?
根@主机:~ netstat-tulpna grep 26047 tcp6 10
26047,1,0
关闭等待26047 / Java TCP6 1 0 127.0.0.1 48 790
127.0.0.1:8080关闭等待26047 /JAVA TCP6 1 0 127.0.0.1 48 788 88 120.0.1 8080关闭等待
26047 / Java TCP6 1 1 127.0.0.1
127.0.0.1:8080关闭-等待26047/JA
客户端请求头
标题-http-outgoing-1>>get/healthz http/1.1[调试]标题-
http-outgoing-1>>主机:本地主机:8080[调试]标题-
http-outgoing-1>>连接:保持活动[调试]标题-
http-outgoing-1>>用户代理:apache httpclient/4.5.6
(Java/1.80Y181)[Debug ]标题- HTTP OutGoang-1≫Gt;接受编码:
gzip,deflate[调试]头-http-outgoing-4>gt;get/healthz
http/1.1协议
服务器响应头
[调试]连线-http-outgoing-0<<
“http/1.1200[\r][\n]”[debug]wire-http-outgoing-0<<“日期:thu,
2018年10月11日14:28:03 GMT[\r][\n]“[debug]wire-http-outgoing-0<<
“内容长度:0[\r][\n]”[debug]wire-http-outgoing-0<<“服务器:
apache tomee[\r][\n]“[debug]wire-http-outgoing-0<”[\r][\n]”
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>