パフォーマンステストの目的でJavaベースのHTTPボットを実装しています。マルチスレッド環境に適したJava HTTPクライアントライブラリをお勧めします。マルチスレッドアプリケーションのHTTPクライアント
標準的な回答はApache HTTP clientのようですが、これは同期的で、私にはこの場合には非同期の解決策が必要だと思われます。
パフォーマンステストの目的でJavaベースのHTTPボットを実装しています。マルチスレッド環境に適したJava HTTPクライアントライブラリをお勧めします。マルチスレッドアプリケーションのHTTPクライアント
標準的な回答はApache HTTP clientのようですが、これは同期的で、私にはこの場合には非同期の解決策が必要だと思われます。
ええ、それはApache Clientについての私のバグです。単純なものだけが必要な場合は、URLとopenConnection()を使用することができます。
HTTPクライアントのThreadSafeClientConnManager
を使用する必要があります。スレッド間でHttpClient
という1つのインスタンスを再利用できるようになります。詳細については、thisガイドを参照してください。ここで
は(ApacheのHTTPClientのに基づいて)あなたが欲しいものを実装して、簡単な例である:
public class ApacheHttpTransportImpl extends BaseHttpTransport {
private final CloseableHttpClient threadSafeClient;
private final IdleConnectionMonitorThread monitor;
public ApacheHttpTransportImpl() throws NoSuchAlgorithmException, KeyManagementException {
super(config);
ConnectionSocketFactory socketFactory = new PlainConnectionSocketFactory();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", socketFactory).build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
cm.setMaxTotal(256);
cm.setDefaultMaxPerRoute(64);
RequestConfig clientConfig = RequestConfig.custom().setConnectTimeout(2000)
.setSocketTimeout(1000).setConnectionRequestTimeout(2000).build();
threadSafeClient = HttpClients.custom().setDefaultRequestConfig(clientConfig).setConnectionManager(cm).build();
monitor = new IdleConnectionMonitorThread(cm, this);
monitor.setDaemon(true);
monitor.start();
}
public CloseableHttpClient get() {
return threadSafeClient;
}
private static class IdleConnectionMonitorThread extends Thread {
private final PoolingHttpClientConnectionManager cm;
private final BlockingQueue<Stop> stopSignal = new ArrayBlockingQueue<Stop>(1);
private final ApacheHttpTransportImpl cp;
private static class Stop {
private final BlockingQueue<Stop> stop = new ArrayBlockingQueue<Stop>(1);
public void stopped() {
stop.add(this);
}
public void waitForStopped() throws InterruptedException {
stop.take();
}
}
IdleConnectionMonitorThread(PoolingHttpClientConnectionManager cm, ApacheHttpTransportImpl cp) {
super();
this.cm = cm;
this.cp = cp;
}
@Override
public void run() {
try {
Stop stopRequest;
while ((stopRequest = stopSignal.poll(5, TimeUnit.SECONDS)) == null) {
cm.closeExpiredConnections();
cm.closeIdleConnections(60, TimeUnit.SECONDS);
}
stopRequest.stopped();
} catch (InterruptedException e) {
}
}
}
}
そして、ここではそれがどのように使用できるかです:
またApacheHttpTransportImpl transport = new ApacheHttpTransportImpl();
HttpGet httpGet = new HttpGet("http://www.google.com");
CloseableHttpResponse httpResponse = transpot.get().execute(httpGet);
、あなたが取ることができますUnirestを見てください - それはApacheのhttpclientにも基づいていますが、使い方は非常に簡単です。
私は単純なものは必要ありませんが、私は良いパフォーマンスと安定性を提供するものが必要です:-)。 –
HTTPClientをスレッドセーフな方法で使用できるようです: https://hc.apache.org/httpclient-3.x/threading.html – JohnnyK