Почему Jetty Http Client такой медленный? - PullRequest
4 голосов
/ 25 января 2012

У меня подключенный Http-клиент, настроенный следующим образом:

    HttpClient client = new HttpClient();
    client.setTimeout(connectionTimeout);
    client.setIdleTimeout(readTimeout);
    client.setMaxConnectionsPerAddress(100);
    client.setThreadPool(new QueuedThreadPool(100));
    client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
    client.setMaxRetries(retries);

, и приведенный ниже вызов всегда занимает ~ 400 мс, что кажется продолжительным для асинхронного вызова.Для уточнения меня не беспокоит время ответа на запрос.Просто вызов метода держит мой поток занятым в течение 400 мс.Кажется, этот метод где-то блокируется, но он должен быть асинхронным.

    client.send(httpExchange);

Я что-то путаю с моей конфигурацией?

Ответы [ 2 ]

4 голосов
/ 25 января 2012

У меня не было времени проверить это, но я подозреваю, что ваше исправление

client.setConnectBlocking(false);

Может показаться, что по умолчанию HttpClient блокирует соединение, даже если соединитель не блокируетдля отправки / получения запроса + ответа.

(Предполагается, что Jetty 7. Я не проверял Jetty 8)

0 голосов
/ 25 января 2012

Я не знаю, почему вызов send() может длиться так долго, но если он слишком медленный для вас, то просто перевести вызов send() в другой поток:

public class SendThread extends Thread {
    private HttpClient client;
    private HttpExchange exchange;

    public SendThread(HttpClient client, HttpExchange exchange) {
        this.client = client;
        this.exchange = exchange;
    }

    @Override
    public void run() {
        client.send(exchange);
    }
}

Тогда вы можете сделать:

new SendThread(client, exchange).start();

... вместо:

client.send(httpExchange);

Если вы хотите попытаться выяснить, почему библиотека занимает так много времени, вы также можете попробовать просмотреть исходный код . На первый взгляд я бы сказал, что 1) то, что делает send(), не совсем тривиально, и 2) единственное, что кажется асинхронным, - это отправка фактических данных / полезной нагрузки на сервер; такие вещи, как создание начального соединения с сервером, по-видимому, выполняются синхронно как часть вызова send().

...