Я пытался реализовать пул соединений для моего приложения, используя 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)
уведомит менеджер соединений о том, что соединение больше не используется, и, таким образом, освободит соединение, которое будетиспользуется другими потоками.Поэтому я предполагаю, что с управлением соединением все в порядке.
Я предполагаю, что предоставил достаточно информации, пожалуйста, скажите мне, если я хочу добавить что-нибудь еще.
Спасибо