hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rallavagu <rallav...@gmail.com>
Subject Keep-Alive
Date Mon, 06 Jun 2016 20:43:54 GMT
HttpClient 4.3.2, JDK 7

I was doing something similar to what is talked in this link related to 
http commons client 3.x

http://httpcomponents.10934.n7.nabble.com/quot-Keep-alive-quot-stale-connections-and-socket-reuse-td15315.html

I am using PoolingHttpClientConnectionManager with following SocketConfig.

SocketConfig socketConfig = 
SocketConfig.copy(SocketConfig.DEFAULT).setSoKeepAlive(true).setSoReuseAddress(true).build();

 From debug logs, I see that connections are maintained in the pool. 
Here is the snippet from the log.

[DEBUG] 06/06/2016 12:58:16 
org.apache.http.impl.conn.PoolingHttpClientConnectionManager Connection 
request: [route: {s}->https://<host>:443][total kept alive: 1; route 
allocated: 1 of 50; total allocated: 1 of 100]
[DEBUG] 06/06/2016 12:58:16 
org.apache.http.impl.conn.PoolingHttpClientConnectionManager Connection 
leased: [id: 2][route: {s}->https://<host>:443][total kept alive: 0; 
route allocated: 1 of 50; total allocated: 1 of 100]
[DEBUG] 06/06/2016 12:58:16 
org.apache.http.impl.conn.PoolingHttpClientConnectionManager Connection 
released: [id: 2][route: {s}->https://<host>:443][total kept alive: 1; 
route allocated: 1 of 50; total allocated: 1 of 100]

What I am noticing is that every time a connection is used (leased) from 
the pool, a connection is being established (socketConnect) to the 
server unless requested in quick successions where a connection is 
detected as "not stale". Snippet from "MainClientExec.java"

if (config.isStaleConnectionCheckEnabled()) {
             // validate connection
             if (managedConn.isOpen()) {
                 this.log.debug("Stale connection check");
                 if (managedConn.isStale()) {
                     this.log.debug("Stale connection detected");
                     managedConn.close();
                 }
             }
         }


Using AspectJ, I could track connection opening to the server.

[INFO] 06/06/2016 12:58:00 com.test.aop.AbstractLogAspect 
SSLConnectionSocketFactory.java:232.connectSocket arguments [30000, 
Socket[addr=<host>/<IP Address>,port=443,localport=49439], 
https://<host>:443, <host>/<IP Address>:443, null, 
org.apache.http.client.protocol.HttpClientContext@137f7542] Execution 
time: 313

The above call is not happening when "managedConn.isStale()" returns false.

As you can see, I would like to avoid the "connectSocket" call as it is 
expensive. Am I right in my assumption that a "keep-alive" connection is 
supposed to work on an already established socket so it is being reused? 
Also,  I understand that we can't rely on isStale() method. Any 
comments/suggestions are welcome.

Thanks in advance.


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org


Mime
View raw message