Łą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.

Author: PLNech, 2011-01-31

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.

 15
Author: Tom Anderson,
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.

 19
Author: pssh,
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.

 16
Author: Manoj N V,
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.

 14
Author: eriknguyen,
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

 7
Author: serg.nechaev,
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
 1
Author: Octavian Ionel,
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.

 -2
Author: Charon Chui,
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