Apache HttpClient 4.4.1忽略请求超时

时间:2018-10-26 22:04:04

标签: java timeout apache-httpclient-4.x

我的Java代码使用共享的Apache HttpClient 4.4.1。我将各个POST请求级别的连接超时,套接字超时和连接请求超时设置为100毫秒。大多数情况下,它都能正常工作。但是,在大量请求(压力测试)下,HttpClient会忽略这些超时。请求可能需要20秒或更长时间。 这是我的代码:

private HttpResponse execHttp(HttpRequestBase request, HttpClient client) {
    RequestConfig params = RequestConfig.custom()
               .setConnectTimeout(100)
               .setSocketTimeout(100)
               .setConnectionRequestTimeout(100)
               .build();
    // Set config
    request.setConfig(params);

    // Measure time
    long tStart = System.currentTimeMillis();
    // Execute Http request
    HttpResponse response = client.execute(request);

    // Calculate and print time
    long tDiff = System.currentTimeMillis() - tStart;
    logger.debug(String.format("HTTPCLIENT EXEC TIME:  FROM REQUEST %d / %d / %d MS  ACTUAL %d MS", 
                                    request.getConfig().getSocketTimeout(),
                                    request.getConfig().getConnectTimeout(),                                  
                                    request.getConfig().getConnectionRequestTimeout(),  
                                    tDiff));
    return response;
}

在某些情况下,我会得到这样的日志记录:

  

2018-10-26 14:18:45,496 [my-thread-1]调试   com.mypackage.HttpTimeoutTest-HTTPCLIENT执行时间:从请求   100/100/100 MS实际20044 MS

代码中是否缺少任何内容?还是有任何变通办法如何使其始终应用超时?

1 个答案:

答案 0 :(得分:1)

您的代码别无其他。如果这是HttpClient的错误,那么您可以尝试使用最新版本,以查看是否解决了该问题。如果这是瓶颈,那么打开HttpClient的“上下文日志记录”可能会有所帮助。

话虽如此,套接字超时仅用于数据包到达之间的时间。因此,如果您一直以非常慢的速率获取数据包,那么您的总请求时间可能很容易比超时时间长得多。如果发生这种情况,那么您将需要产生一个异步任务来以硬超时间隔中止请求。