Łączenie połączeń HTTP przy użyciu HttpClient
- Jak mogę utworzyć pulę połączeń przy użyciu HttpClient? Muszę nawiązywać częste połączenia z tym samym serwerem. Czy warto stworzyć taki basen?
- Czy możliwe jest utrzymywanie połączeń na żywo i używanie ich do różnych żądań, a jeśli tak, to jak Mogę to zrobić?
Rozwijam się w Javie, używając Apache HTTP Client.
7 answers
[zakładając Javę i HttpClient Apache ' a]
Użyj Menedżera ThreadSafeClientConnManager . Przekazuje pojedynczą instancję globalną do konstruktora każdej instancji HttpClient. Myślę, że nie ma sensu łączyć samych HttpClients.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-12 07:28:27
PoolingClientConnectionManager
jest teraz przestarzały . from (4.3 version) use PoolingHttpClientConnectionManager
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-28 10:26:04
ThreadSafeClientConnManager jest przestarzały, zamiast tego użyj PoolingClientConnectionManager.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 14:21:20
Spędziłem ostatnie dni pracując nad tym, więc po prostu chcę podzielić się z Wami wiedzą "wszyscy znani".
Po pierwsze, ponieważ masz do czynienia z tym samym serwerem, zaleca się użycie jednego klienta HTTP do wykonania żądań. Za pomocą PoolingHttpClientConnectionManager
, twój Klient może być używany do wykonywania wielu żądań jednocześnie. Oficjalny przykład wielowątkowej realizacji żądania można znaleźć tutaj .
Po Drugie, HTTP / 1.1 (i ulepszone wersje HTTP/1.0) pozwala HTTP klienci, aby utrzymać połączenia otwarte po zakończeniu transakcji, dzięki czemu można je ponownie wykorzystać do przyszłych żądań. Jest to często określane jako trwałe połączenie.
Również w celu ponownego użycia klienta dla wielu żądań, nagłówek odpowiedzi z serwera często zawiera wywołanie atrybutu Keep-Alive
, które zawiera Czas, w którym bieżące połączenie będzie utrzymywane przy życiu. Poza tym, klient Http Apache zapewnia również interfejs ConnectionKeepAliveStrategy
, aby dostosować własną politykę ponownego użycia połączenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 07:32:00
Dla HttpClient 4x:
ThreadSafeClientConnManager ... zarządza pulą klientów connections i jest w stanie obsługiwać żądania połączenia z wielu wątków wykonawczych.
Połączenia są łączone na podstawie trasy. Wniosek o trasę, dla której kierownik już ma stałe połączenie dostępne w puli będzie obsługiwany przez leasing połączenia z basen zamiast tworzyć zupełnie nowy połączenie.
Http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 00:22:28
Jest to przykład puli połączeń Apache HttpClient 4.3, które nie wymagają uwierzytelniania:
public class PoolOfHttpConnections{
static String[] urisToGet = {"http://www.site1.com", "http://www.site2.com"};
public static void main(String[] args) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
// create a thread for each link
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
HttpGet httpget = new HttpGet(urisToGet[i]);
threads[i] = new GetThread(httpClient, httpget);
}
// start the threads
for (int j = 0; j < threads.length; j++) {
threads[j].start();
}
// join the threads
for (int j = 0; j < threads.length; j++) {
threads[j].join();
}
} //end main
private static class GetThread extends Thread {
private final CloseableHttpClient httpClient;
private final HttpContext context;
private final HttpGet httpget;
public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
this.httpClient = httpClient;
this.context = HttpClientContext.create();
this.httpget = httpget;
}
@Override
public void run() {
try {
CloseableHttpResponse response = httpClient.execute(httpget, context);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
Date date = new Date();
System.out.println("Beginning*******************");
System.out.println(date.toString());
System.out.println("There are "+urisToGet.length+" threads running in parallel!");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
} finally {
response.close();
System.out.println("End*******************");
}
} catch (ClientProtocolException ex) {
// Handle protocol errors
} catch (IOException ex) {
// Handle I/O errors
}
}
} /*end private class*/ }//end public class PoolOfHttpConnections
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 16:26:43
HttpClient ma już połączenie pool.So nie musisz go tworzyć. Użyj go.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-15 09:47:25