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 .

Oleg


---------------------------------------------------------------------
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