【问题标题】:Apache HttpClient 4.4.1 ignores request timeoutApache HttpClient 4.4.1 忽略请求超时
【发布时间】:2019-03-31 16:36:15
【问题描述】:

我的 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

代码中是否缺少任何内容?或者是否有任何解决方法如何使其始终应用超时?

【问题讨论】:

  • 您的代码显示您配置“httpRequestBase”,但执行“请求”。
  • 抱歉@DaneWhite 在清理我的代码时错过了这个。已更新。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多