Java Apache HttpClient 4.4.1忽略请求超时

Java Apache HttpClient 4.4.1忽略请求超时,java,timeout,apache-httpclient-4.x,Java,Timeout,Apache Httpclient 4.x,我的Java代码使用共享的ApacheHttpClient 4.4.1。我将每个POST请求级别上的连接超时、套接字超时和连接请求超时设置为100毫秒。它大部分时间都很好用。然而,在大量请求(压力测试)时,HttpClient忽略这些超时;请求可能需要20秒或更长时间。 这是我的密码: private HttpResponse execHttp(HttpRequestBase request, HttpClient client) { RequestConfig params = Req

我的Java代码使用共享的ApacheHttpClient 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:45496[my-thread-1]调试 com.mypackage.HttpTimeoutTest-HTTPCLIENT执行时间:从请求 100/100/100毫秒实际20044毫秒


代码中有什么遗漏吗?或者,是否有任何解决方法可以使其始终应用超时

您的代码没有其他突出之处。如果它是HttpClient的一个bug,那么您可以尝试使用最新版本,看看是否可以解决它。如果这是一个瓶颈,那么打开HttpClient的“上下文日志记录”可能会提供一些见解


也就是说,套接字超时仅适用于数据包到达之间的时间。因此,如果您一直以非常慢的速度获取数据包,那么您的总请求时间很容易就会比超时时间高得多。如果发生这种情况,则您需要生成一个异步任务,以在硬超时间隔中止请求。

您的代码显示您正在配置“httpRequestBase”,但正在执行“request”。抱歉@Danewite在清理我的代码时错过了这一任务。更新。