On 6/13/16 1:20 PM, Rallavagu wrote:


On 6/13/16 12:12 PM, Oleg Kalnichevski wrote:
On Mon, 2016-06-13 at 11:23 -0700, Rallavagu wrote:

On 6/7/16 6:13 AM, Oleg Kalnichevski wrote:
On Mon, 2016-06-06 at 13:43 -0700, Rallavagu wrote:
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?

Yes, you are.

Thanks. I could validate that keep-alive connection works on already
established socket.

Also,  I understand that we can't rely on isStale() method. Any
comments/suggestions are welcome.


Please consider upgrading to 4.5.2. Stale connection check logic has
been reworked in 4.5
I have upgraded to 4.5.2 and found that "setValidateAfterInactivity"
method could be used to check for stale connections.

I have a background thread to detect and clear idle/expired connections
from PoolingHttpClientConnectionManager. I wonder how would
"setValidateAfterInactivity" impact that if at all.


It would not (unless, of course, expiry deadline is less than inactivity
period).

I understand that per http/1.1 spec a keep-alive request is assumed to
be "forever" in case server does not respond with keep-alive header.
But, connections are in fact not left open forever (in tomcat, it
defaults to 20 sec; connectionTimeout="20000"). Doesn't it make sense to
set a response header so a client can manage keep-alive connection more
gracefully by sending "Connection: close" when they expire? In the case
of background thread to check expired connections, there won't be any as
server never responded with keep-alive header and connections are marked
to be kept alive forever. Is the only solution is to create a servlet
filter that sets the response header?


Use custom ConnectionKeepAliveStrategy to set a finite keep-alive period
by default .
It appears to me that a ConnectionKeepAliveStrategy can applied to
"CloseableHttpClient".

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

Wondering if I can apply this to PoolingHttpClientManager so it is
applicable all connections in the pool?

Thanks
Never mind. I am using Jersey client it has limitation on customizing CloseableHttpClient that is used by ApacheConnector.





Oleg


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


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

Reply via email to