Apache HTTPClient не устанавливает более двух подключений - PullRequest
5 голосов
/ 07 октября 2011

Я пытался реализовать пул соединений для моего приложения, используя Apache HTTPClient (v4.1).Проблема заключается в том, что клиент всегда выполняет только два соединения во время работы, хотя параллельных потоков достаточно.Я уже некоторое время пытаюсь изменить код, но пока ничего не помогло.
Я использую ThreadSafeClientConnManager для пула соединений и устанавливаю MaxTotal и DefaulMaxPerRoute в значения, которые я хочу.
Есть ли что-нибудь, что приходит вам в голову первым, что я мог бы захотеть проверить?

Вот тот сегмент кода, который я использую для создания клиента.

DefaultHttpClient createClient() {
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(60000));
    params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(60000));
    params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("https", sf, 6443));
    registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, registry);
    cm.setMaxTotal(2 * maxConnections);
    cm.setDefaultMaxPerRoute(maxConnections);

    HttpHost localhost = new HttpHost("localhost");
    cm.setMaxForRoute(new HttpRoute(localhost), maxConnections);

    HttpHost sdpTargetHost = new HttpHost("webserviceIP", webservicePort, "https");
    cm.setMaxForRoute(new HttpRoute(sdpTargetHost, null, true), maxConnections);

    return new DefaultHttpClient(cm, params);
}

Клиент, возвращаемый этой функцией, используется в Runnables, управляемом ThreadPoolExecutor.Runnables используют клиента и имеют следующие строки:

HttpResponse response = httpClient.execute(httpPost, context);
HttpEntity entity = response.getEntity();
....
EntityUtils.consume(entity);

Из того, что я знаю, EntityUtils.consume(entity) уведомит менеджер соединений о том, что соединение больше не используется, и, таким образом, освободит соединение, которое будетиспользуется другими потоками.Поэтому я предполагаю, что с управлением соединением все в порядке.

Я предполагаю, что предоставил достаточно информации, пожалуйста, скажите мне, если я хочу добавить что-нибудь еще.

Спасибо

Ответы [ 2 ]

7 голосов
/ 14 октября 2011

OK.Я нашел решение, спасибо oleg за указание ведения журнала, а также Google и всем форумам.
Все, что мне нужно было сделать, это определить класс только с помощью диспетчера соединений, а затемустановите HttpParams, используя HttpClient.setParams ().Таким образом, код будет выглядеть примерно так:

DefaultHttpClient createClient() {
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("https", sf, 6443));

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(registry);
    cm.setMaxTotal(maxConnections);
    cm.setDefaultMaxPerRoute(maxConnections);

    HttpHost targetHost = new HttpHost("webserviceIP", webservicePort, "https");
    cm.setMaxForRoute(new HttpRoute(targetHost, null, true), maxConnections);

    return new DefaultHttpClient(cm);
}

И прямо перед использованием клиента

DefaultHttpClient httpClient = createClient();
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(60000));
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(60000));
params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);
httpClient.setParams(params);

Очевидно, что в коде нет разницы логически , но это исправило мою проблему.Я предполагаю, что это, вероятно, какая-то ошибка в API HttpClient 4.1.

0 голосов
/ 11 января 2015

Мне не удалось установить эту опцию в см

cm.setDefaultMaxPerRoute(maxConnections);

Нужно было сделать так:

ConnPerRoute perRoute = new ConnPerRouteBean(100);
ConnManagerParams.setMaxConnectionsPerRoute(params, perRoute);
ConnManagerParams.setMaxTotalConnections(params, 100);
ConnManagerParams.setTimeout(params, 15000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...