Ich verwende google-api-client-java 1.2.1-alpha, um eine POST-Anforderung auszuführen, und erhalte die folgende Stapelverfolgung, wenn ich die HttpRequest ausführe ().
Dies geschieht unmittelbar nachdem ich einen 403-Fehler von einem vorherigen POST an dieselbe URL abgefangen und ignoriert und den Transport für die nachfolgende Anforderung erneut verwendet habe. (Es befindet sich in einer Schleife, in der mehrere Einträge in denselben ATOM-Feed eingefügt werden.)
Gibt es etwas, das ich tun sollte, um nach einem 403 aufzuräumen?
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)
Warum sollte der Code unter mir versuchen, eine neue Verbindung herzustellen?
java
httpclient
google-api-java-client
David Bullock
quelle
quelle
Antworten:
Sie müssen den Antworttext verwenden, bevor Sie die Verbindung für eine andere Anforderung wiederverwenden können. Sie sollten nicht nur den Antwortstatus lesen, sondern die Antwort
InputStream
vollständig bis zum letzten Byte lesen, wobei Sie die gelesenen Bytes einfach ignorieren.quelle
google-api-java-client
, das der bedeutete FangIOException
durch geworfenHttpResponse.execute()
, Prüfung / Gießen esHttpResponseException
, den Zugriff auf dasresponse
Element, und dann den AufrufparaseAsString()
an ihn. (Was sich jedenfalls als nützliche Information herausstellte: -)HttpRequest.execute()
diese Ressourcen automatisch bereinigt werden, wenn die Methode keinHttpResponse
Objekt zurückgibt. Darüber hinausHttpResponse
empfiehlt das JavaDoc von jetzt, aufzurufen,response.disconnect()
falls der Inhalt der HTTP-Antwort (in einemfinally
Block) nicht vollständig gelesen wird .Ich hatte ein ähnliches Problem, als ich den HttpClient mit Jetty zum Erstellen eines Testframeworks verwendete. Ich musste von meinem Client aus mehrere Anforderungen an das Servelet erstellen, aber es gab bei der Ausführung dieselbe Ausnahme.
Ich habe eine Alternative unter http://foo.jasonhudgins.com/2010/03/http-connections-revisited.html gefunden
Sie können diese folgende Methode auch verwenden, um Ihren Client zu instanziieren.
quelle
Eine ähnliche Ausnahmemeldung (seit mindestens Apache Jarkata Commons HTTP Client 4.2) lautet:
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the connection before allocating another one.
Diese Ausnahme kann auftreten, wenn zwei oder mehr Threads mit einem einzelnen interagieren
org.apache.http.impl.client.DefaultHttpClient
.Wie können Sie eine 4.2-
DefaultHttpClient
Instanz threadsicher machen ( threadsicher in dem Sinne, dass zwei oder mehr Threads damit interagieren können, ohne über die Fehlermeldung hinauszugehen)? Stellen SieDefaultHttpClient
ein VerbindungspoolingClientConnectionManager
in Form vonorg.apache.http.impl.conn.PoolingClientConnectionManager
!quelle
Dies ist eine häufig gestellte Frage. Die Antwort von BalusC ist korrekt. Bitte fangen Sie HttpReponseException und rufen Sie HttpResponseException auf. Antwort . ignorieren (). Wenn Sie die Fehlermeldung lesen müssen, verwenden Sie die Antwort. parseAsString (), wenn Sie den Inhaltstyp der Antwort nicht kennen, andernfalls, wenn Sie den Inhaltstyp kennen, verwenden Sie die Antwort. parseAs (MyType.class).
Ein einfaches Code-Snippet aus YouTubeSample.java in youtube-jsonc-sample (obwohl Sie normalerweise in einer echten Anwendung etwas Klügeres tun möchten):
Vollständige Offenlegung: Ich bin Eigentümer des Google-API-Java-Client- Projekts.
quelle
Ich hatte das gleiche Problem mit einem jax-rs (resteasy)
Response
Objekt in meinen Unit-Tests. Ich habe dies mit einem Aufruf vonresponse.releaseConnection();
The releaseConnection () gelöst - Die Methode befindet sich nur für das Resteasy-ClientResponse
Objekt, daher musste ich eine Besetzung vonResponse
bis hinzufügenClientResponse
.quelle
Versuche dies
quelle
Ok, ich habe ein ähnliches Problem, all diese Lösungen funktionieren nicht, ich habe auf einem Gerät getestet, das Problem war das Datum im Gerät, es war 2011 statt 2013, überprüfen Sie auch, ob dies helfen kann.
quelle
Lesen Sie den InputStream folgendermaßen:
quelle
Verbrauchen Sie einfach die Antwort wie unten, um das Problem zu lösen
quelle