我的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
代码中是否缺少任何内容?还是有任何变通办法如何使其始终应用超时?
答案 0 :(得分:1)
您的代码别无其他。如果这是HttpClient的错误,那么您可以尝试使用最新版本,以查看是否解决了该问题。如果这是瓶颈,那么打开HttpClient的“上下文日志记录”可能会有所帮助。
话虽如此,套接字超时仅用于数据包到达之间的时间。因此,如果您一直以非常慢的速率获取数据包,那么您的总请求时间可能很容易比超时时间长得多。如果发生这种情况,那么您将需要产生一个异步任务来以硬超时间隔中止请求。