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-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org