2014-05-19 4 views
0

J'ai une application qui continue d'appeler un API pour les données json, et assez rapidement j'ai vu cette exception 'Timeout en attente de connexion du pool', j'ai fait une recherche de fuite causée par contenu non consommé, donc je mis à jour le code pour fermer la inputstream après consommer le jsondata, mais encore a ceux de dépassement de délai de connexion, voici mon code:ConnectionPoolTimeoutException: timeout en attente de connexion depuis le pool

InputStream is = ApiUtil.getAsStream(Api.get(bookUrl).param("limit","500").param("bookId", bid).enable(Options.LongRunning), 3); 
List<JsonBook> books = mapper.readValue(is, BOOK_TYPE); 
is.close() 

Api: 
    private JsonHttpClient client; 
    public APIForGet get(String endpoint) { 
    return new APIForGet(this.client, endpoint); 
    } 

ApiUtil: 
    public static InputStream getAsStream(APIForGet get, Iterable<Long>retries) { 
     return get.asStream();  
    } 
APIForGet: 
    private JsonHttpClient client; 
    public InputStream asStream() { 
     return this.client.getAsStream(this.hostname, this.port, this.endpoint, params, optionsArray()); 
    } 

JsonHttpClientImpl: 
    public InputStream getAsStream(Optional<String> host, Optional<Integer> port,String path, Multimap<String, String> param, Options ... options) { 
    HttpResponse reponse; 
    try { 
    response = request.execute(); 
    if (response.isSuccessStatusCode()) { 
     return response.getContent(); 
    } 
    } catch (Exception e) { 
    throw new Exception(); 
    } 
} 

la logique d'emballage est un peu compliqué, mais finalement je penser en fermant l'inputtream devrait fonctionner, des pensées? Merci!

+0

vous avez d'autres possibilités? – asgs

Répondre

0
try { 
    response = request.execute(); 
    if (response.isSuccessStatusCode()) { 
     return response.getContent(); 
    } 
    } catch (Exception e) { 
    throw new Exception(); 
    }finally{ 
     //TODO release conn or abort 
    }