Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache httpclient连接花费的时间太长_Java_Httpclient - Fatal编程技术网

Java Apache httpclient连接花费的时间太长

Java Apache httpclient连接花费的时间太长,java,httpclient,Java,Httpclient,我正在构建一个使用Web服务的客户端。 我需要做的一件事是发送一个POST请求,然后存储返回的cookie。 当我使用curl命令发送它时,获得响应大约需要不到2秒的时间。 这是我使用的命令: curl -c cookies.txt --cert client_certificate -X POST -H "Content-Type: application/json" -d 'request_body' "https://my_target_web_service" 但是,当我使用Apach

我正在构建一个使用Web服务的客户端。 我需要做的一件事是发送一个POST请求,然后存储返回的cookie。 当我使用curl命令发送它时,获得响应大约需要不到2秒的时间。 这是我使用的命令:

curl -c cookies.txt --cert client_certificate -X POST -H "Content-Type: application/json" -d 'request_body' "https://my_target_web_service"
但是,当我使用ApacheHttpClient(4.3.1)时,大约需要5秒钟。 方法如下:

@Test
public void firstCall() throws Exception {
    final String url = "https://my_target_web_service";
    final String requestBody = readFile("json/request_body.json");
    Executor executor = executor();
    CookieStore cookieStore = new BasicCookieStore();
    executor.cookieStore(cookieStore);

    Request request = Request.Post(url).bodyString(requestBody, ContentType.APPLICATION_JSON);
    LOG.debug(request.toString());

    Response response = executor.execute(request);
    LOG.info(response.returnResponse().getStatusLine().toString());
}

private Executor executor() throws Exception {
    KeyStore clientStore = secretKeyStore();
    SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(clientStore, "secret_key".toCharArray()).useTLS().build();
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
            SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
    Executor executor = Executor.newInstance(httpclient);
    return executor;
}
日志输出显示大部分时间用于建立到Web服务的连接(注意从15:44:12610跳到15:44:17426):

谁能告诉我我错过了什么或做错了什么?或者,这是httpclient和/或java的限制吗


谢谢,

您是否比较了从coe中删除LOG.debug和LOG.info行后的时间?日志语句不会影响该时间,这也不是HttpClient或Java的“限制”。很难说要花这么长时间做什么,但是在任何情况下,像这样的性能测试都应该通过多次运行来完成,而不是简单的“1对1”调用。根据我的经验,HttpClient非常快,但初始化可能需要一些时间。通过调用
executor()
方法测量时间。不要在每次请求时都打电话。
DEBUG [2013-10-16 15:44:12,485] [main                          ] org.apache.http.client.protocol.RequestAddCookies: CookieSpec selected: best-match
DEBUG [2013-10-16 15:44:12,500] [main                          ] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection request: [route: {s}->https://...:443][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
DEBUG [2013-10-16 15:44:12,517] [main                          ] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection leased: [id: 0][route: {s}->https://...:443][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
DEBUG [2013-10-16 15:44:12,524] [main                          ] org.apache.http.impl.execchain.MainClientExec: Opening connection {s}->https://...:443
DEBUG [2013-10-16 15:44:12,610] [main                          ] org.apache.http.conn.HttpClientConnectionManager: Connecting to ...:443
DEBUG [2013-10-16 15:44:17,426] [main                          ] org.apache.http.impl.execchain.MainClientExec: Executing request POST / HTTP/1.1
DEBUG [2013-10-16 15:44:17,427] [main                          ] org.apache.http.impl.execchain.MainClientExec: Target auth state: UNCHALLENGED
DEBUG [2013-10-16 15:44:17,427] [main                          ] org.apache.http.impl.execchain.MainClientExec: Proxy auth state: UNCHALLENGED