一个GET请求的Apache HTTPClient 4.3.3执行方法将阻止并且永远不会返回

问题描述 投票:8回答:1

从早上开始面对这个怪异的问题,我正在对特定端点进行REST调用,该端点在页面中提供响应,因此我需要一次又一次地调用直到所有页面都完成。我的代码可以正常工作,直到由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();
        }
    }
}
java rest apache-httpclient-4.x apache-httpcomponents
1个回答
15
投票

我相当确定您的代码会泄漏并最终用尽连接。

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);    
© www.soinside.com 2019 - 2024. All rights reserved.