0

I have app that keep calling an api for json data, and pretty quickly i saw this 'Timeout waiting for connection from pool' exception, I googled around and found that's a connection leak caused by content not consumed, so i updated the code to close the inputstream after consume the jsondata, but still got those connection timeout exception, here is my code:

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

the wrapping logic here is kind of complicated, but eventually i think by closing the inputstream should work, any thoughts? Thanks!

user468587
  • 4,799
  • 24
  • 67
  • 124

1 Answers1

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