2014-09-04 15 views
5

Ho letto l'Jersey documentation, e si dice Jersey chiude automaticamente una connessione dopo un'entità viene letto (ad esempio response.readEntity (SomeObject.class))Il client Jersey chiude la connessione in caso di eccezione?

Ma quando viene generata un'eccezione, sia un cattivo richiesta o una timeout del socket, Jersey chiude automaticamente la connessione o dovrei avere una clausola finally che chiama client.close()?

risposta

5

No. Né Jersey chiama client.close() in caso di eccezione, né lo strumento JerseyClient implementa AutoCloseable.

È possibile testarlo facilmente. Un client lancia un'IllegalStateException se si richiama un metodo dopo la chiusura:

Client client = ClientBuilder.newClient(); 
client.close(); 
client.target("http://stackoverflow.com").request().get(); // IllegalStateException 

Ma si può invocare un metodo dopo la cattura un'eccezione:

Client client = ClientBuilder.newClient(); 
try { 
    client.target("http://foo.bar").request().get(); // java.net.ConnectException: Operation timed out 
} catch (Exception ex) { 
    client.target("http://stackoverflow.com").request().get(); // works 
} 

Così chiusura è il tuo lavoro.

Aggiornamento: JAX-RS 2.1 will use AutoClosables.

+0

Grazie, lefloh – Jason

+0

Che ne dici di Jersey 1.1x? Ho controllato il documento API e non è stato trovato alcun metodo close(). Solo destroy() è disponibile ma non pensate che sia uguale. – DerekY

+0

Da ApiDoc: "Distruggi il client: tutte le risorse di sistema associate al client verranno eliminate". Quindi le connessioni dovrebbero essere chiuse. – lefloh

Problemi correlati