hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Li Li <fancye...@gmail.com>
Subject I have set read time out but thread hang on socketRead0
Date Mon, 14 Apr 2014 04:08:13 GMT
I am using http client 4.3. I use PoolingHttpClientConnectionManager
with many threads.
but I found one thread hangs on socketRead0(other thread is correct)

netstat -anotp|grep 5872
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.11.181:35251        192.168.11.169:61616
     ESTABLISHED 5872/java           off (0.00/0/0)
tcp        0      0 192.168.11.181:35252        192.168.11.169:61616
     ESTABLISHED 5872/java           off (0.00/0/0)
tcp        0      0 49.4.132.244:56035          221.204.231.139:80
     ESTABLISHED 5872/java           off (0.00/0/0)
tcp        0      0 192.168.11.181:41935        192.168.11.151:2181
     ESTABLISHED 5872/java           off (0.00/0/0)

java stack:
"Thread-51" prio=10 tid=0x00007f7dfc20d800 nid=0x1846 runnable
[0x00007f7d5c5c4000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:152)
        at java.net.SocketInputStream.read(SocketInputStream.java:122)
        at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)
        at org.apache.http.impl.io.SessionInputBufferImpl.read(SessionInputBufferImpl.java:195)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:178)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
        at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
        at org.apache.http.impl.execchain.ResponseEntityWrapper.streamClosed(ResponseEntityWrapper.java:120)
        at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:227)
        at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
        at org.apache.http.util.EntityUtils.consume(EntityUtils.java:88)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:222)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:136)
        at com.founder.httpclientfetcher.HttpClientFetcher.httpGet(HttpClientFetcher.java:464)

my codes:
defaultRequestConfig = RequestConfig
    .custom()
    .setCookieSpec(CookieSpecs.BEST_MATCH)
    .setExpectContinueEnabled(true)

    .setConnectTimeout(this.getConnectTimeout())
    .setConnectionRequestTimeout(this.getConnectionRequestTimeout())
    .setSocketTimeout(this.getReadTimeout()).build();

HttpClientBuilder builder = HttpClients.custom();

ConnectionKeepAliveStrategy myStrategy = null;
HttpClientConnectionManager connManager = null;

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
    .<ConnectionSocketFactory> create()
    .register("http",
    PlainConnectionSocketFactory.getSocketFactory())
    .register("https",
    SSLConnectionSocketFactory.getSocketFactory())
    .build();
connManager = new PoolingHttpClientConnectionManager(
socketFactoryRegistry, null, new DNSResolverWithCache(
dnsCache));

((PoolingHttpClientConnectionManager) connManager).setMaxTotal(this
    .getMaxTotalConnection());
((PoolingHttpClientConnectionManager) connManager)
    .setDefaultMaxPerRoute(this.getMaxConnectionPerRoute());
myStrategy = new ConnectionKeepAliveStrategy() {
    public long getKeepAliveDuration(HttpResponse response,
           HttpContext context) {
        // Honor 'keep-alive' header
        HeaderElementIterator it = new BasicHeaderElementIterator(
        response.headerIterator(HTTP.CONN_KEEP_ALIVE));
        while (it.hasNext()) {
            HeaderElement he = it.nextElement();
            String param = he.getName();
            String value = he.getValue();
            if (value != null && param.equalsIgnoreCase("timeout")) {
                try {
                     return Long.parseLong(value) * 1000;
                } catch (NumberFormatException ignore) {
            }
         }
      }
      return HttpClientFetcher.this.defaultKeepAlive;
    }

};
builder.setKeepAliveStrategy(myStrategy);
client = builder.setConnectionManager(connManager)
.setProxy(getProxy())
.setRetryHandler(new MyHttpRequestRetryHander(retryCount))
.setDefaultRequestConfig(defaultRequestConfig)
.setUserAgent(this.getUserAgent()).build();

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