Ответ 1
[предполагается, что Java и Apache HttpClient]
Используйте ThreadSafeClientConnManager. Передайте один глобальный экземпляр в конструктор каждого экземпляра HttpClient. Я не думаю, что есть какой-то момент в объединении самих HttpClients.
Я развиваюсь на Java, используя Apache HTTP Client.
[предполагается, что Java и Apache HttpClient]
Используйте ThreadSafeClientConnManager. Передайте один глобальный экземпляр в конструктор каждого экземпляра HttpClient. Я не думаю, что есть какой-то момент в объединении самих HttpClients.
PoolingClientConnectionManager
теперь устарел. из (версии 4.3) используйте PoolingHttpClientConnectionManager
.
ThreadSafeClientConnManager теперь устарел, вместо этого используйте PoolingClientConnectionManager.
Я провел последние дни, работая над этим, поэтому просто хочу поделиться с вами "всеми известными" знаниями.
Во-первых, поскольку вы имеете дело с одним и тем же сервером, для выполнения ваших запросов рекомендуется использовать один HTTP-клиент. С помощью PoolingHttpClientConnectionManager
ваш клиент может использоваться для одновременного выполнения нескольких запросов. Официальный пример многопоточного выполнения запроса можно найти здесь.
Во-вторых, HTTP/1.1 (и расширенные версии HTTP/1.0) позволяет HTTP-клиентам поддерживать открытые соединения после завершения транзакций, чтобы их можно было повторно использовать для будущих запросов. Это часто называют Постоянное соединение.
Также для повторного использования клиента для нескольких запросов заголовок ответа с сервера часто включает в себя вызов атрибута Keep-Alive
, который содержит текущее время, которое будет поддерживаться в текущий момент. Кроме того, Apache Http Client также предоставляет вам интерфейс ConnectionKeepAliveStrategy
, чтобы настроить собственную политику для повторного использования соединения.
Для HttpClient 4x:
ThreadSafeClientConnManager... управляет пулом клиента соединений и может обслуживать запросы на соединение из нескольких потоков выполнения.
Соединения объединяются по принципу маршрута. Запрос маршрута, для которого менеджер уже имеет постоянное соединение, доступное в пуле, будет обслуживаться путем лизинга соединения от пул, а не создание совершенно нового соединения.
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
Это пример пула соединений Apache HttpClient 4.3, который не требует аутентификации:
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
У HttpClient уже есть пул соединений. Поэтому вам не нужно его создавать. Просто используйте его.