Время отклика в CloseableHttpAsyncClient

Я использую CloseableHttpAsyncClient API Apache для выполнения нескольких запросов, не заботясь об ответе.

Мой код: -

//Настройка HTTP-клиента :-

 IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
                .setIoThreadCount(Runtime.getRuntime().availableProcessors())
                .setConnectTimeout(connectTimeOut)
                .setSoTimeout(socketTimeOut)
                .build();

ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);

PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
connManager.setMaxTotal(maxTotalConnection);

CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
        .setConnectionManager(connManager)
        .setDefaultCredentialsProvider(provider)
        .build();


httpclient.start();

//Hit multiple request :- 
int totalRequestCount  = 1500;
for(int i = 1; i < totalRequestCount : i++) {
    final HttpPost postRequest = new HttpPost(url);

    StringEntity stringEntity;
    try {
        stringEntity = new StringEntity(requestString);
        stringEntity.setContentType("application/json");
        postRequest.setEntity(stringEntity);
    } catch (UnsupportedEncodingException e) {
    }

    long startTime = System.currentTimeMillis();

    httpclient.execute(postRequest, new FutureCallback<HttpResponse>() {

        public void completed(final HttpResponse response) {
            long endTime = System.currentTimeMillis();
            long duation = endTime - startTime;
        }

        public void failed(final Exception ex) {
            postRequest.releaseConnection();
        }

        public void cancelled() {
            postRequest.releaseConnection();
        }
    });
}

Но продолжительность в нескольких запросах не подходит должным образом. Любое предложение ?


person Rahul Jain    schedule 18.09.2017    source источник
comment
Я думаю, что вы не должны выпускать соединение из apache 4.x. Я бы предположил, что продолжительность не приходит, потому что вы не используете объект ответа. Это можно сделать с помощью EntityUtils.consume(httpResponse.getEntity()); . Думаю, более подробный ответ можно найти здесь: stackoverflow.com/questions/30889984/   -  person DonatasD    schedule 18.09.2017
comment
Что вы имеете в виду, говоря, что продолжительность не подходит должным образом? Чего вы ожидаете и что получаете?   -  person algrid    schedule 18.09.2017
comment
Опечатка: duation → продолжительность   -  person Cœur    schedule 09.07.2019
comment
@Rahul Jain Отправляет ли HTTP-запрос?   -  person Lin Chen    schedule 26.12.2019


Ответы (1)


Если вы не дождетесь получения всех ответов, вы не сможете измерить, сколько времени потребуется для их получения.

Вам необходимо предоставить нефиктивную реализацию для FutureCallback, которая (по крайней мере) записывает, что ответ был получен. Тогда нужно дождаться ответов.

Когда вы это сделаете, вам также нужно будет иметь дело с возможностью того, что некоторые запросы могут быть отброшены на стороне сервера.

person Stephen C    schedule 09.07.2019