Apache httpClient 4.3.3 Способ выполнения блоков получения запросов и никогда не возвращается

StackOverflow https://stackoverflow.com//questions/22069821

Вопрос

Осталось на эту странную проблему с утра, я делаю отдохнуть вызов на определенную конечную точку, которая дает ответы на страницах, поэтому мне нужно снова и снова звонить, пока все страницы не будут завершены.Мой код работает нормально и DANDY до последней страницы после последней страницы следующий запрос, которого я делаю (что должно вернуть пустую страницу) by httpClient.execute(httpGet); навсегда заблокирован и никогда не возвращается или не бросает любое исключение.Если я устанавливаю время запроса на соединение, то последний звонок не заблокирован и не проходит, чтобы попробовать время ожидания, но я не получаю, почему последний звонок не работает , если я сделаю тот же последний вызов от Firefox Restclient, он работает .Пожалуйста, помогите.

Я также пытался добавить разные уровни журнала, таких как System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); и другие журналы для отладки, но не удача.

ниже мой код.

private static Servers fetchServers(String token,String endpoint) throws Exception{
    JsonReader jreader = null;
    InputStreamReader isr = null;
    CloseableHttpClient httpClient = null;
    try{
        URI uri = new URI(endpoint);

        /** accepting all certificates */
        httpClient = getSecuredHttpClient();

        uri = new URIBuilder(uri)
                .setParameter("limit", "1")//Page limit, for testing have kept just 1 since i have only 2 records.
                .build();

        HttpGet httpGet = new HttpGet(uri);

        httpGet.setHeader(HTTP.CONTENT_TYPE, "application/json");
        httpGet.setHeader("X-Auth-Token", token);
        httpGet.setHeader("accept", "application/json");
        httpGet.setHeader(HTTP.USER_AGENT, "python-neutronclient");

        Servers cloudServers = new Servers();
        cloudServers.setServers(new ArrayList<Server>());

        boolean nextPage = false;

        do {
                HttpResponse resp = httpClient.execute(httpGet);//this is where it gets blocked for last page.
                if(resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                    isr = new InputStreamReader(resp.getEntity().getContent());
                    jreader = new JsonReader(isr);
                    Gson gson = new GsonBuilder().registerTypeAdapter(Address.class, new AddressAdapter()).create();

                    Servers servers = gson.fromJson(jreader, Servers.class);
                    cloudServers.getServers().addAll(servers.getServers());

                    if(servers.getServersLinks() == null || servers.getServersLinks().size()==0)
                        nextPage = false;
                    else if(servers.getServersLinks().get(0).getRel().equals("next"))
                        nextPage = true;

                    uri = new URI(servers.getServersLinks().get(0).getHref());//this gives the url for next page.
                    httpGet.setURI(uri);
                }else{
                    break;
                }
        } while (nextPage);
        return cloudServers;
    }catch(Exception e){
        throw e;
    }finally{
        if(null != jreader){
            jreader.close();
        }
        if(null != isr){
            isr.close();
        }
        if(null != httpClient){
            httpClient.close();
        }
    }
}
.

Это было полезно?

Решение

Я достаточно уверен, что ваш код просто утечки и в конечном итоге выходит из подключений.

do {
    CloseableHttpResponse resp = httpClient.execute(httpGet);
    try {

    // Do what you have to do 
    // but make sure the response gets closed no matter what
    // even if do not care about its content

    } finally {
        resp.close();
    }        
} while (nextPage);    
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top