繁体   English   中英

Apache HttpClient 3.1套接字超时

[英]Apache HttpClient 3.1 socket timeout

我正在以以下方式使用Apache HttpClient 3.1执行Web服务请求:

private MultiThreadedHttpConnectionManager cm = null;
private HttpClient client = null;

// Setting up connection manager during init process
cm = new MultiThreadedHttpConnectionManager();
int connectionTimeout = 12000; // it actually comes from config file, but this is the current value
cm.getParams().setConnectionTimeout(connectionTimeout);
cm.getParams().setTcpNoDelay(true);
client = new HttpClient(cm);

// method is prepared with request data earlier
int socketTimeout = 30000; // it actually comes from config file, but this is the current value
method.getParams().setSoTimeout(socketTimeout);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));

logger.info("Starting request");
int statusCode = client.executeMethod(method);
logger.info("StatusCode = " + statusCode);
String response = method.getResponseBodyAsString();
logger.info("Response = " + response);

日志文件中的时间戳如下:

2017-05-02 08:50:03,881 Starting request
2017-05-02 08:50:16,680 StatusCode = 200
2017-05-02 08:50:46,708 java.net.SocketTimeoutException

因此,即使连接超时设置为12秒,executeMethod调用也花费了将近13秒。 我对此感到困惑,因为此处的文档尚不清楚:说executeMethod和getResponseBodyAsString都分别使用套接字超时是正确的吗? 因此,在这种情况下,套接字超时为30秒,因此理论上执行是否需要60秒才能完成?

连接超时无关紧要。 您得到的状态码为200,这意味着连接成功,并且您至少读取了一些标头。 读取超时设置为30秒,这意味着服务器在30秒内未发送任何其他内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM