2017-05-02 69 views
0

我以下列方式执行与Apache的HttpClient 3.1 Web服务请求:的Apache的HttpClient 3.1套接字超时

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秒才能完成?

回答

2

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

+0

我明白了,谢谢。 –