Risposta breve:
request.releaseConnection()
sta rilasciando la connessione HTTP sottostante per consentirgli di essere riutilizzato. response.close()
sta chiudendo un flusso (non una connessione), questo flusso è il contenuto della risposta che stiamo trasmettendo dal socket di rete.
lungo Risposta:
Il modello giusto da seguire in qualsiasi versione recente> 4.2 e probabilmente anche prima, è di non usare releaseConnection
.
request.releaseConnection()
rilascia il sottostante HttpConnection modo la richiesta può essere riutilizzato, tuttavia il dottore Java dice:
Un metodo comodo per semplificare la migrazione da HttpClient 3.1 API ...
Invece di rilasciare la connessione, ci assicuriamo che il contenuto della risposta sia completamente consumato, il che a sua volta assicura che la connessione sia rilasciata e pronta per il riutilizzo. Un breve esempio è mostrato sotto:
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
try {
System.out.println(response1.getStatusLine());
HttpEntity entity1 = response1.getEntity();
// do something useful with the response body
String bodyAsString = EntityUtils.toString(exportResponse.getEntity());
System.out.println(bodyAsString);
// and ensure it is fully consumed (this is how stream is released.
EntityUtils.consume(entity1);
} finally {
response1.close();
}
Ciao Matt, c'è qualche riferimento per questo? La documentazione non è del tutto chiara su come la connessione può essere rilasciata, ad esempio se attraverso response.close o httpclient.close. Tutti gli esempi contengono solo il primo, quindi sembra che questo sia sufficiente, ma solo per essere sicuri. Inoltre, puoi spiegare perché EntityUtils.consume è necessario anche dopo EntityUtils.toString che dovrebbe esaurire l'intero inputstream? –
Perché EntityUtils.consume? Questa risposta risponde alla tua domanda: "Si riduce davvero ad essere un" buon cittadino "(e davvero conoscere i contratti delle interfacce HTTPClient). Ciò che EntityUtils.consume farà è liberare tutte le risorse detenute da httpEntity, il che implica essenzialmente il rilascio di qualsiasi sottostante Trasmetti lo stream e restituisci l'oggetto Connection al suo pool (nel caso in cui il gestore delle connessioni sia multithreading) o liberando la gestione connessione in modo che possa elaborare la richiesta successiva. " - http://stackoverflow.com/questions/15969037/why-did-the-author-use-entityutils-consumehttpentity – Matt
Inoltre: https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html /fundamentals.html e controlla la sezione 1.1.5 e 1.1.6 che spiega che puoi chiudere senza consumare: "Quando si lavora con entità di streaming, si può usare il metodo EntityUtils # Consume (HttpEntity) per assicurare che il contenuto dell'entità abbia stato completamente consumato e il flusso sottostante è stato chiuso. Possono esserci situazioni ... quando è necessario recuperare solo una piccola parte dell'intero contenuto della risposta e la penalità delle prestazioni per consumare il contenuto rimanente e rendere la connessione riutilizzabile è troppo alta. ... " – Matt