使用HttpRequest.execute()时的异常 | Java Debug 笔记

702 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:使用HttpRequest.execute()时的异常: Invalid use of SingleClientConnManager: connection still allocated

我使用google-api-client-java 1.2.1-alpha来执行一个POST请求,并在我执行HttpRequest()时产生了以下堆栈跟踪。

在我捕获并忽略了先前的POST到相同URL的一个403错误之后,它就发生了,并重用了后续请求传输。(在一个循环中,它向同一个ATOM feed 插入多个项)。

在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完全读取到最后一个字节,虽然你会忽略读取的字节。

回答二

尝试这样

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");
    }

文章翻译自Stack Overflow:stackoverflow.com/questions/4…