Я правильно использую CloseableHttpClient?
Вот как я использую CloseableHttpClient:
private static final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(myurl);
HttpResponse httpResponse = httpClient.execute(httpGet);
По сути, приведенный выше код находится в одноэлементном классе, поэтому только один экземпляр httpClient
присутствует, обслуживающий все запросы.
Будет ли это ударом производительности, когда один httpClient обслуживает все запросы? Потому что я вижу медлительность в моей системе при получении httpResponse.
Еще один вопрос, который у меня есть: мне нужно закрыть какой-либо из вышеперечисленных ресурсов и если да, то когда?
1 ответ
Рассмотрите возможность использования диспетчера пула подключений, согласно документации:
PoolingHttpClientConnectionManager - более сложная реализация, которая управляет пулом клиентских подключений и может обслуживать запросы на подключение из нескольких потоков выполнения. Соединения объединяются для каждого маршрута. Запрос на маршрут, для которого у менеджера уже есть постоянное соединение, доступное в пуле, будет обслуживаться арендой соединения из пула, а не созданием нового соединения.
Поэтому я бы порекомендовал изменить ваш код следующим образом:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//configure it as per your reqiurements, i.e.
cm.setMaxTotal(5000);
cm.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
Также имейте в виду, что существует бесплатный инструмент для тестирования нагрузки с открытым исходным кодом, называемый Apache JMeter, который, в частности, использует компоненты Apache HttpComponents, поэтому вы можете использовать его для целей нагрузочного тестирования или заглянуть в базовую реализацию, если у вас есть сомнения.
Я бы порекомендовал пересмотреть ваш подход и использовать JMeter, поскольку при нагрузочном тестировании веб-приложений необходимо учитывать множество факторов (заголовки, файлы cookie, кэш, аутентификация, запросы AJAX, встроенные ресурсы и т. Д.) И может потребоваться огромные усилия, чтобы правильно реализовать все. При необходимости вы можете создать / запустить тест JMeter через его API из кода Java, см. Статью Пять способов запуска теста JMeter без использования статьи с графическим интерфейсом JMeter.