Apache HTTP Client を使用して、Javaで開発しています。
[JavaとApacheのHttpClientを想定]
ThreadSafeClientConnManager を使用します。単一のグローバルインスタンスをすべてのHttpClientインスタンスのコンストラクターに渡します。 HttpClient自体をプールすることに意味はないと思います。
PoolingClientConnectionManager
は非推奨になりました。 (4.3バージョン)からPoolingHttpClientConnectionManager
を使用します。
私は最近これに取り組んでいるので、「誰もが知っている」知識をあなたと共有したいだけです。
まず、同じサーバーを扱っているため、単一のHTTPクライアントを使用して要求を実行することをお勧めします。 PoolingHttpClientConnectionManager
を使用すると、クライアントを使用して複数の要求を同時に実行できます。マルチスレッドのリクエスト実行の公式例は here にあります。
次に、HTTP/1.1(およびHTTP/1.0の拡張バージョン)により、HTTPクライアントは、トランザクションが完了した後も接続を開いたままにしておくことができ、将来のリクエストで再利用できます。多くの場合、これはPersistent Connectionと呼ばれます。
また、複数のリクエストでクライアントを再利用するために、サーバーからの応答ヘッダーには属性呼び出しKeep-Alive
現在の接続が維持される時間を含む。それに加えて、Apache Http Clientは、接続を再利用するための独自のポリシーをカスタマイズするためのインターフェイスConnectionKeepAliveStrategy
も提供します。
ThreadSafeClientConnManagerは非推奨になりました。代わりに PoolingClientConnectionManager を使用してください。
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