HTTP-клиент для многопоточного приложения - PullRequest
1 голос
/ 11 ноября 2011

Я использую Java-бот на основе Java для тестирования производительности. Может кто-нибудь предложить клиентскую библиотеку Java HTTP, подходящую для многопоточной среды.

Похоже, стандартный ответ HTTP-клиент Apache , но он синхронный, и мне кажется, что в этом случае мне нужно какое-то асинхронное решение.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2011

Вы должны использовать HTTP-клиент ThreadSafeClientConnManager. Это позволит вам повторно использовать один экземпляр HttpClient в разных потоках. См. это руководство для получения дополнительной информации.

1 голос
/ 23 августа 2016

Вот простой пример, который реализует то, что вы хотите (на основе 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.

0 голосов
/ 11 ноября 2011

Да, это раздражает меня в клиенте Apache. Если вам нужно только что-то простое, вы можете просто использовать URL и openConnection ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...