[英]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.