2016-08-25 3 views
0

Я недавно переключился с java.net на org.apache.http.client, у меня есть ClosableHttpClient с HttpClientBuilder. В качестве менеджера соединений я использую BasicHttpClientConnectionManager.Apache HttpComponents BasicHttpClientConnectionManager

Теперь у меня есть проблема, что очень часто, когда я создаю HTTP-запрос, я получаю исключение тайм-аута. Похоже, что диспетчер соединений поддерживает открытые соединения для повторного использования, но если система простаивает в течение нескольких минут, это соединение будет отключено, и когда я сделаю следующий запрос, первое, что я получу, - это тайм-аут. Повторяя один и тот же запрос еще раз, он обычно работает без каких-либо проблем.

Есть ли способ настроить BasicHttpClientConnectionManager, чтобы не повторять его подключения и создавать новое соединение каждый раз?

+0

@ScaryWombat глядя на документацию java.net.Socket, кажется, что тайм-аут сокет будет только контролировать, как долго 'чтения()' вызов будет блокировать. Вы уверены, что это подходит в моей ситуации? 'closeIdleConnections', похоже, будет закрывать ** в настоящее время ** бездействующие соединения и будет иметь эффект только один раз. Но мне нужно что-то, что я могу настроить один раз, и он будет применяться для всех открытых соединений. – lanoxx

+0

извините, что вы правы –

+0

@ScaryWombat ОК, спасибо в любом случае, есть ли у вас какие-либо другие предложения? – lanoxx

ответ

1

Там несколько способов решения этой проблемы

  1. выселить простаивающие соединения когда больше не требуется. В приведенном ниже коде эффективно отключается постоянство соединений, закрывая постоянные соединения после каждого обмена HTTP.

    BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); 
    CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(cm).build(); 
    ... 
    try (CloseableHttpResponse response = httpclient.execute(new HttpGet("/"))) { 
        System.out.println(response.getStatusLine()); 
        EntityUtils.consume(response.getEntity()); 
    } 
    cm.closeIdleConnections(0, TimeUnit.MILLISECONDS); 
    
  2. соединения Предел поддержания активности время на что-то относительно небольшой иш

    BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); 
    CloseableHttpClient httpclient = HttpClients.custom() 
         .setConnectionManager(cm) 
         .setKeepAliveStrategy((response, context) -> 1000) 
         .build(); 
    try (CloseableHttpResponse response = httpclient.execute(new HttpGet("/"))) { 
        System.out.println(response.getStatusLine()); 
        EntityUtils.consume(response.getEntity()); 
    } 
    
  3. (рекомендуется) Использование менеджера пула соединений и установить соединение общее время жить к конечному значению. Нет никаких преимуществ при использовании базового диспетчера подключений по сравнению с пулом, если ваш код не будет запущен в контейнере EJB.

    CloseableHttpClient httpclient = HttpClients.custom() 
         .setConnectionTimeToLive(5, TimeUnit.SECONDS) 
         .build(); 
    try (CloseableHttpResponse response = httpclient.execute(new HttpGet("/"))) { 
        System.out.println(response.getStatusLine()); 
        EntityUtils.consume(response.getEntity()); 
    } 
    
Смежные вопросы