I made the switch from URLConnection to httpclient 4.5.2 a few days a go, but 
now I am facing hangs. I am using HTTPClient in a multithreaded application 
with proxies and here is how my methods look like.  After some time the methods 
get stuck at java.net.SocketInputStream.socketRead and nothing happens. I am 
using my program in production and I really need to find a fix.


TIMEOUT is set to 5000 and useProxy is set to True





        public StringBuffer getMeta(int current, int total) throws 
myappUnauthorizedException
        {
                StringBuffer result = new StringBuffer();
                String url = "https://api.myapp.com/meta";;
                CloseableHttpClient httpclient = 
HttpClientBuilder.create().setMaxConnPerRoute(100000).disableAutomaticRetries().build();
                CloseableHttpResponse response = null;
                URL urlObj;


                try
                {
                        urlObj = new URL(url);


                        RequestConfig config = null;
                        if (useProxy)
                        {
                                myapp.Proxy proxyCustom = getRandomProxy();
                                HttpHost proxy = new 
HttpHost(proxyCustom.getProxyIp(), proxyCustom.getProxyPort(), "http");
                                config = 
RequestConfig.custom().setSocketTimeout(TIMEOUTSOCKET).setConnectTimeout(TIMEOUT).setConnectionRequestTimeout(TIMEOUT).setProxy(proxy).build();
                        }
                        else if (!useProxy)
                        {
                                config = 
RequestConfig.custom().setSocketTimeout(TIMEOUTSOCKET).setConnectTimeout(TIMEOUT).setConnectionRequestTimeout(TIMEOUT).build();
                        }


                        HttpGet request = new HttpGet(url);
                        request.setConfig(config);


                        // add request header
                        request.addHeader("platform", platform);
                        request.addHeader("X-Auth-Token", 
ThreadLocalManager.myappToken.get());
                        request.addHeader("User-Agent", USER_AGENT);
                        request.addHeader("os-version", osVersion);
                        request.addHeader("Accept-Language", "en");
                        request.addHeader("app-version", appVersion);
                        request.addHeader("host", urlObj.getHost());
                        request.addHeader("Connection", "Keep-Alive");
                        request.addHeader("Accept-Encoding", "gzip");


                        response = httpclient.execute(request);
                        int responseCode = 
response.getStatusLine().getStatusCode();


                        if (responseCode == 403)
                        {
                                throw new myappForbiddenException("403 Status 
code");
                        }
                        else if (responseCode == 401)
                        {
                                throw new myappUnauthorizedException("Token not 
valid!");
                        }


                        BufferedReader rd = new BufferedReader(new 
InputStreamReader(response.getEntity().getContent(), "UTF-8"));


                        String line = "";
                        while ((line = rd.readLine()) != null)
                        {
                                result.append(line);
                        }
                }
                catch (javax.net.ssl.SSLPeerUnverifiedException | 
javax.net.ssl.SSLHandshakeException | org.apache.http.NoHttpResponseException | 
java.net.SocketTimeoutException | org.apache.http.conn.ConnectTimeoutException 
| org.apache.http.conn.HttpHostConnectException | myappForbiddenException rex)
                {
                        System.out.println(rex.getMessage());
                        if (current < total)
                        {
                                
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.YELLOW).a("Recalling 
getMeta() " + current).reset());
                                // System.out.println("Recalling getMeta() " + 
current);
                                result = getMeta(++current, total);
                        }
                        else
                        {
                                // System.out.println("TOO MANY TRIES ON THE 
GETMETA METHOD!");
                                
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.RED).bold().a("TOO MANY TRIES 
ON THE getMeta() METHOD! I GAVE UP!").reset());
                        }
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
                finally
                {
                        try
                        {
                                if (response != null)
                                        response.close();
                                httpclient.close();
                        }
                        catch (IOException e)
                        {
                                e.printStackTrace();
                        }
                }


                return result;
        }




















"Thread4" #13 prio=5 os_prio=0 tid=0x00007fa420386000 nid=0x120a runnable 
[0x00007fa409efc000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:170)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
        at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
        at sun.security.ssl.InputRecord.read(InputRecord.java:532)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
        - locked <0x0000000706b806b8> (a java.lang.Object)
        at 
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
        - locked <0x0000000706b80678> (a java.lang.Object)
        at 
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
        at 
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
        at 
org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
        at 
org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.upgrade(DefaultHttpClientConnectionOperator.java:192)
        at 
org.apache.http.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:369)
        at 
org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:415)
        at 
org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at 
org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at 
org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at 
org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
        at myapp.Common.getMeta(Common.java:687)
        at myapp.Common.getMeta(Common.java:714)
        at myapp.Common.setupNewAccount(Common.java:101)
        at myapp.myapp.run(Myapp.java:97)
        at java.lang.Thread.run(Thread.java:745)

Reply via email to