Java 多线程应用程序的HTTP客户端

Java 多线程应用程序的HTTP客户端,java,http,asynchronous,Java,Http,Asynchronous,为了进行性能测试,我正在实现基于Java的HTTP bot。任何人都可以推荐适合多线程环境的Java HTTP客户端库 看起来标准答案是,但它是同步的,在我看来,在这种情况下,我需要一些异步解决方案。是的,这让我对Apache客户端产生了反感。如果您只需要一些简单的东西,您可以使用URL和openConnection()您应该使用HTTP客户端的。它将允许您跨线程重用HttpClient的一个实例。有关更多信息,请参阅指南。以下是一个实现所需功能的简单示例(基于apache httpclient

为了进行性能测试,我正在实现基于Java的HTTP bot。任何人都可以推荐适合多线程环境的Java HTTP客户端库


看起来标准答案是,但它是同步的,在我看来,在这种情况下,我需要一些异步解决方案。

是的,这让我对Apache客户端产生了反感。如果您只需要一些简单的东西,您可以使用URL和openConnection()

您应该使用HTTP客户端的。它将允许您跨线程重用
HttpClient
的一个实例。有关更多信息,请参阅指南。

以下是一个实现所需功能的简单示例(基于apache httpclient):


此外,您还可以看一看-它的使用非常简单,尽管它也基于apache httpclient。

我不需要简单的东西,我需要提供良好性能和稳定性的东西:-)。看起来您可以以线程安全的方式使用该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);