2015-06-17 16 views
8
CloseableHttpResponse response = null; 
try { 
    // do some thing .... 
    HttpPost request = new HttpPost("some url"); 
    response = getHttpClient().execute(request); 
    // do some other thing .... 
} catch(Exception e) { 
    // deal with exception 
} finally { 
    if(response != null) { 
     try { 
      response.close(); // (1) 
     } catch(Exception e) {} 
     request.releaseConnection(); // (2) 
    } 
} 

Ho eseguito un'esecuzione di richiesta http come sopra.qual è la differenza tra CloseableHttpResponse.close() e httpPost.releaseConnection()?

Per rilasciare la connessione sottostante, è corretto chiamare (1) e (2)? e qual è la differenza tra le due invocazioni?

Grazie mille!

risposta

11

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

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? –

+0

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

+0

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

Problemi correlati