为什么Jetty Http Client这么慢?

时间:2012-01-24 23:42:01

标签: java jetty

我有一个jetty 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毫秒,这对于异步调用似乎很长。澄清我并不担心请求的响应时间。只是方法调用使我的线程忙碌400ms。看来这种方法在某处阻塞,但它应该是异步的。

    client.send(httpExchange);

我是否搞砸了我的配置?

2 个答案:

答案 0 :(得分:4)

我没有时间测试这个,但我怀疑你的修复是

client.setConnectBlocking(false);

默认情况下,HttpClient会在连接时阻塞 - 即使连接器对请求+响应的发送/接收没有阻塞。

(假设Jetty 7.我没有检查Jetty 8)

答案 1 :(得分:-1)

我不知道为什么对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);

如果您想尝试找出图书馆花费这么长时间的原因,您也可以尝试查看source code。快速浏览一下,我会说1)send()所做的并不是微不足道的; 2)唯一看似异步的是将实际数据/有效负载发送到服务器;诸如创建与服务器的初始连接之类的事情似乎是作为send()调用的一部分同步完成的。