繁体   English   中英

为什么Jetty Http Client这么慢?

[英]Why is Jetty Http Client so slow?

我有一个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);

我搞砸了我的配置怎么样?

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

client.setConnectBlocking(false);

看来,默认情况下,连接上的HttpClient会阻塞 - 即使连接器对请求+响应的发送/接收是非阻塞的。

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

我不知道为什么对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()调用的一部分同步完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM