Исключение --- SingleClientConnManager: соединение все еще выделено - PullRequest
0 голосов
/ 10 января 2012

У меня есть код для чтения ответа на странице. это выглядит так.

public static void main(String[] args)
    {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpEntity entity  = null;
        try{

            String it= "https://www.aaa/login";
                HttpPost httpost = new HttpPost(it);

                List <NameValuePair> ln= new ArrayList <NameValuePair>();
                ln.add(new BasicNameValuePair("un", "aaa"));
                ln.add(new BasicNameValuePair("pwd", "bbb"));
                httpost.setEntity(new UrlEncodedFormEntity(ln, HTTP.UTF_8));

                HttpResponse  response = httpclient.execute(httpost);
                entity  = response.getEntity();
                GZIPInputStream gis= new GZIPInputStream(entity.getContent());
            StringBuffer st = new StringBuffer();
                for (int c = gis.read(); c != -1; c = gis.read()) {
                    st.append((char)c);
                }

                    CookieStore cookieStore = httpclient.getCookieStore();
                    HttpContext httpContext = new BasicHttpContext();
                    httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
                    HttpGet httpget = new HttpGet("http://aaa/index");
                    HttpResponse httpResponse = httpclient.execute(httpget, httpContext);
                    entity = httpResponse.getEntity();

                    if (entity != null) {
                        BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
                        String readLine;
                        while(((readLine = br.readLine()) != null)) {
                          System.err.println("br   :"+readLine);
                    }


                }                
        }catch(Exception e){
            e.printStackTrace();
        }
        finally{

            EntityUtils.consume(entity);
            httpclient.getConnectionManager().shutdown();
        }

Когда я запускаю эту программу, я получаю следующее исключение.

java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
    at org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:216)
    at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:190)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)

Я закрыл соединение в блоке finally. Как предложено в другой ветке, я использовал тело ответа перед повторным использованием соединения. что еще здесь пошло бы не так?

1 Ответ

2 голосов
/ 09 июля 2012

до

HttpResponse httpResponse = httpclient.execute(httpget, httpContext);

Вам также нужно

EntityUtils.consume(entity);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...