Exception à l'aide de HttpRequest.execute(): Invalid use of SingleClientConnManager: connexion continue d'être affectée
Je suis en utilisant google-api-client-java 1.2.1-alpha pour exécuter une requête POST, et je suis de mieux en le suivant stacktrace quand j'execute() HttpRequest.
Cela se produit immédiatement après que je les attraper et de les ignorer une erreur 403 partir d'un POST précédent vers la même URL, et ré-utilisé le transport de la demande ultérieure. (Il est dans une boucle de l'insertion de plusieurs entrées pour le même flux ATOM).
Il ya quelque chose que je devrais faire pour "nettoyer" après une 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)
Pourquoi le code ci-dessous m'être d'essayer d'acquérir une nouveau connexion?
- Cela semble encore être un problème avec la version 1.11.0-beta :/
- Pour le bénéfice de toute personne arrivant ici, après avoir essayé de consommer les réponses et encore obtenir les mises en garde, j'ai trouvé la bonne réponse ici: tech.chitgoks.com/2011/05/05/...
- à l'aide de la tech.chitgoks.com approche résolu mon problème.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de consommer le corps de la réponse avant de pouvoir réutiliser la connexion pour une autre demande. Vous ne devriez pas seulement de lire l'état de la réponse, mais lire la réponse
InputStream
entièrement pour le dernier octet de laquelle vous ignorez les octets lus.google-api-java-client
, cela signifiait la capture de laIOException
jetés parHttpResponse.execute()
, les tests/moulageHttpResponseException
, l'accès à laresponse
membre, puis en l'invoquantparaseAsString()
sur elle. (Qui s'est avéré être une information utile, de toute façon :- )HttpRequest.execute()
permettra de nettoyer automatiquement ces ressources, si la méthode ne retourne pas laHttpResponse
objet. En outre, la JavaDoc deHttpResponse
recommande désormais d'appelerresponse.disconnect()
dans le cas de ne pas lire le contenu de la réponse HTTP (dans unfinally
bloc).J'ai été confronté à un problème similaire lors de l'utilisation de la HttpClient avec ponton pour construire une structure de test. J'ai dû créer de multiples demandes de la Servelet de mon client, mais Il a été de donner la même exception lors de l'exécution.
J'ai trouvé une alternative à http://foo.jasonhudgins.com/2010/03/http-connections-revisited.html
Vous pouvez également utiliser cette méthode pour instancier votre client.
Une exception similaire message (depuis au moins Apache Jarkata Communes Client HTTP 4.2) est:
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
Cette exception peut se produire lorsque deux ou plusieurs threads interagir avec un seul
org.apache.http.impl.client.DefaultHttpClient
.Comment pouvez-vous faire un 4.2
DefaultHttpClient
instance de thread-safe (des threads dans le sens où deux ou plusieurs threads peuvent interagir avec elle, sans obtenir au-dessus de message d'erreur)? FournirDefaultHttpClient
avec une connexion de mise en commun desClientConnectionManager
dans la forme deorg.apache.http.impl.conn.PoolingClientConnectionManager
!C'est une question souvent posée. BalusC la réponse est correcte. Veuillez attraper HttpReponseException, et d'appeler HttpResponseException.réponse.ignorer(). Si vous avez besoin de lire le message d'erreur, utiliser la réponse.parseAsString() si vous ne connaissez pas le contenu de la réponse, sinon, si vous connaissez le type de contenu utiliser la réponse.parseAs(MyType.class).
Un simple extrait de code de YouTubeSample.java dans youtube-jsonc-échantillon (bien que généralement vous aurez envie de faire quelque chose de plus intelligent dans une application réelle):
Divulgation complète: je suis un propriétaire de la google-api-java-client projet.
J'ai eu le même problème avec un jax-rs (resteasy)
Response
objet dans mes tests unitaires.J'ai résolu ce problème avec un appel à
response.releaseConnection();
Le releaseConnection()-Méthode est uniquement sur le resteasy
ClientResponse
objet, donc j'ai dû ajouter un cast deResponse
àClientResponse
.Ok, j'ai le même problème, tous ceux de la solution fonctionne pas, j'ai testé sur un appareil, le problème a été date dans le dispositif, il a été 2011 au lieu de 2013, vérifier aussi cela peut aider.
Essayer cette
Lire la InputStream comme ceci: