Исключение с использованием HTTPREQUEST.EXECUTE (): Неверное использование SingleClientConnManager: соединение все еще выделено

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

Вопрос

Я использую Google-API-CLEATION-JAVA 1.2.1-ALPHA, чтобы выполнить запрос на почту, и получаю следующую стек, когда я выполняю () HTTPREQUEST.

Это происходит сразу после того, как я поймаю и игнорирую ошибку 403 с предыдущего поста к тому же URL, и повторно использовал транспортировку для последующего запроса. (Это в цикле вставления нескольких записей в одинаковый корм для атома).

Есть ли что-то, что я должен делать, чтобы «очистить» после 403?

Exception in thread "main" 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:199)
    at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:173)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:390)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
    at com.google.api.client.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:47)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:207)
    at au.com.machaira.pss.gape.RedirectHandler.execute(RedirectHandler.java:38)
    at au.com.machaira.pss.gape.ss.model.records.TableEntry.executeModification(TableEntry.java:81)

Почему код ниже меня пытается приобрести новый связь?

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

Решение

Вам необходимо потреблять тело ответа, прежде чем вы сможете повторно использовать соединение для другого запроса. Вы должны не только прочитать статус ответа, но прочитайте ответ InputStream Полностью до последнего байта, в результате чего вы просто игнорируете прочитанные байты.

Другие советы

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

Я нашел альтернативу в http://foo.jasonhudgins.com/2010/03/http-connections-revisited.html.

Вы также можете использовать этот следующий метод для создания клиента.

public static DefaultHttpClient getThreadSafeClient()  {

    DefaultHttpClient client = new DefaultHttpClient();
    ClientConnectionManager mgr = client.getConnectionManager();
    HttpParams params = client.getParams();
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, 

            mgr.getSchemeRegistry()), params);
    return client;
}

Подобное сообщение об исключении (так как хотя бы Apache Jarkata Commons Commons Client 4.2):

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the connection before allocating another one.

Это исключение может произойти, когда два или более потоков взаимодействуют с одним org.apache.http.impl.client.DefaultHttpClient.

Как вы можете сделать 4,2 DefaultHttpClient экземпляр deamsafe (Threadsafe. В том смысле, что два или более потока могут взаимодействовать с ним без приведенного выше сообщения об ошибке)? Предоставлять DefaultHttpClient с объединением соединения ClientConnectionManager в виде org.apache.http.impl.conn.PoolingClientConnectionManager!

/* using
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.2.2</version>
    </dependency>
*/

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.impl.conn.SchemeRegistryFactory;
import org.apache.http.params.HttpParams;
import org.apache.http.client.methods.HttpGet;

public class MyComponent {

    private HttpClient client;

    {
        PoolingClientConnectionManager conMan = new PoolingClientConnectionManager( SchemeRegistryFactory.createDefault() );
        conMan.setMaxTotal(200);
        conMan.setDefaultMaxPerRoute(200);

        client = new DefaultHttpClient(conMan);

        //The following parameter configurations are not
        //neccessary for this example, but they show how
        //to further tweak the HttpClient
        HttpParams params = client.getParams();
        HttpConnectionParams.setConnectionTimeout(params, 20000);
        HttpConnectionParams.setSoTimeout(params, 15000);
    }


    //This method can be called concurrently by several threads
    private InputStream getResource(String uri) {
        try {
            HttpGet method = new HttpGet(uri);
            HttpResponse httpResponse = client.execute(method);
            int statusCode = httpResponse.getStatusLine().getStatusCode();
            InputStream is = null;
            if (HttpStatus.SC_OK == statusCode) {
                logger.debug("200 OK Amazon request");
                is = httpResponse.getEntity().getContent();
            } else {
                logger.debug("Something went wrong, statusCode is {}",
                        statusCode);
                 EntityUtils.consume(httpResponse.getEntity());
            }
            return is;
        } catch (Exception e) {
            logger.error("Something went terribly wrong", e);
            throw new RuntimeException(e);
        }
    }
}

Это часто задаваемый вопрос. Ответ Балуса правильный. Пожалуйста, поймите HttpreponseException., и вызовите httpresponseException.отклик.игнорировать(). Если вам нужно прочитать сообщение об ошибке, используйте ответ.ParseassString() Если вы не знаете тип содержимого ответа, иначе, если вы знаете ответ типа содержимого.парус(Mytype.class).

Простой фрагмент кода от YouTubesample.java. в YouTube-JSONC-образец (Хотя обычно вы хотите сделать что-то умнее в реальном приложении):

  } catch (HttpResponseException e) {
    System.err.println(e.response.parseAsString());
  }

Полное раскрытие: я владелец Google-API-Java-Client проект.

У меня была такая же проблема с JAX-RS (RESTAULY) Response объект в моих монтажных тестах. Я решил это с вызовом response.releaseConnection();Realeaseconnection () - метод только на восстановлении ClientResponse объект, поэтому мне пришлось добавить актеры из Response к ClientResponse.

Попробуй это

HttpResponse response = Client.execute(httpGet);
response.getEntity().consumeContent();
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
        //task
    Log.i("Connection", "OK");
    }else{
     Log.i("Connection", "Down");
    }

Хорошо, у меня подобная проблема, все эти решения не работают, я испытывал на некотором устройстве, проблема была дата в устройстве, это было 2011 года, вместо 2013 года, чек также может помочь.

Прочитайте входной поток, как это:

if( response.getStatusLine().getStatusCode() == 200 ) {
    HttpEntity entity = response.getEntity();
    InputStream content = entity.getContent();
    try {
        sb = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( content ), 8 );
        String line;
        while( ( line = bufferedReader.readLine() ) != null ) {
            sb.append( line );
        }
        bufferedReader.close();
        content.close();
    } catch( Exception ex ) {
        Log.e( "statusCode", ex.getMessage() + "" );
    }
}

Просто потребляйте ответа, как ниже, что решит проблему

response.getEntity().consumeContent();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top