2015-10-20 17 views
5

Korzystam z klienta usługi Jersey Client v2.16 (przejściowa zależność od Dropwizard 0.8.0, której również używam).Klient sieci Jersey zamykający odpowiedź InputStream - czy to naprawdę działa?

Jestem w pewien sposób zaintrygowany mechanizmem zamykającym odpowiedź, gdy jednostka jest odczytywana jako InputStream. W documentation stany:

także wtedy, gdy jednostka jest odczytywany w InputStream (przez response.readEntity (InputStream.class)), połączenie pozostaje otwarty aż do zakończenia czytania od InputStream. W takim przypadku InputStream lub Response powinny zostać zamknięte ręcznie na końcu odczytu z InputStream.

Jednak kiedy się podmiot odpowiedzi korzystając Response.readEntity(InputStream.class), co mam skończyć z jest instancją org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream które, jak sama nazwa wskazuje, nie ma nic pod nim zwolnić gdy metoda close() jest nazywany (łamiąc InputStream kontrakt, mogę powiedzieć). Jest to metoda close():

@Override 
public void close() throws IOException { 
    if (LOGGER.isLoggable(Level.FINE)) { 
     LOGGER.log(Level.FINE, LocalizationMessages.MBR_TRYING_TO_CLOSE_STREAM(reader.getClass())); 
    } 
} 

W konsekwencji, kończę z połączeń HTTP w moim basenie jest niepublikowany i powoli napełniania basenu.

Biorąc pod uwagę, że uzyskanie referencji do odpowiedzi może nie być łatwe, a oficjalny dokument mówi: the InputStream **or** the Response should be closed manually, w jaki sposób mogę faktycznie uwolnić zasoby fizyczne?

Odpowiedz

Powiązane problemy