我有一个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);
我是否搞砸了我的配置?
答案 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()
调用的一部分同步完成的。