Java SocketTimeoutException:读取超时httpclient

Java SocketTimeoutException:读取超时httpclient,java,sockets,connection,httpclient,apache-commons-httpclient,Java,Sockets,Connection,Httpclient,Apache Commons Httpclient,我有一个休息服务,每天服务约20米的请求。我得到以下异常。这个问题是间歇性的,我无法将这个问题和请求量联系起来。我在周末的时候也遇到了这个例外,当时的销量非常低。我通过检查setStaleConnectionCheckEnabled确保没有stele连接。我正在使用httpclient 4.3.4 更新:进一步分析后了解更多详细信息- 从日志中,我可以看到服务在300毫秒内响应了大部分请求,但客户端连接到服务本身需要时间,在收到响应时,它已经超过了6秒的阈值,并出现了读取超时异常 getCaus

我有一个休息服务,每天服务约20米的请求。我得到以下异常。这个问题是间歇性的,我无法将这个问题和请求量联系起来。我在周末的时候也遇到了这个例外,当时的销量非常低。我通过检查
setStaleConnectionCheckEnabled
确保没有stele连接。我正在使用
httpclient 4.3.4

更新:进一步分析后了解更多详细信息-

从日志中,我可以看到服务在300毫秒内响应了大部分请求,但客户端连接到服务本身需要时间,在收到响应时,它已经超过了6秒的阈值,并出现了读取超时异常

getCause(): java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:891)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:155)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:284)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:220)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:164)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:139)
at com.sample.SampleClient.doGet(SampleClient.java:137)
客户:

public MyRespBean doGet(String host, String path, List<NameValuePair> nameValuePairs, Map<String, String> headers, AuthParams authParams)
throws URISyntaxException, IOException
{
  RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(6000).setConnectTimeout(6000).setStaleConnectionCheckEnabled(true).build();
  CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
  URI uri = buildUri(host, path, nameValuePairs);
  HttpGet httpGet = new HttpGet(uri);
  httpGet.setHeader("Connection", "close");
  addHeaders(httpGet, headers, authParams);
 **//Error occurs at the following line**
 MyRespBean respBean = (MyRespBean)httpClient.execute(httpGet, new SimpleResponseHandler());
  httpClient.close();
  return respBean;
}
public MyRespBean doGet(字符串主机、字符串路径、列表名称值对、映射头、AuthParams AuthParams)
抛出URISyntaxException,IOException
{
RequestConfig RequestConfig=RequestConfig.custom().setSocketTimeout(6000).setConnectTimeout(6000).SetStaleconConnectionCheckEnabled(true).build();
CloseableHttpClient httpClient=HttpClientBuilder.create().setDefaultRequestConfig(requestConfig.build();
URI=buildUri(主机、路径、nameValuePairs);
HttpGet HttpGet=新的HttpGet(uri);
setHeader(“连接”,“关闭”);
addHeaders(httpGet、headers、authParams);
**//错误发生在下一行**
MyRespBean respBean=(MyRespBean)httpClient.execute(httpGet,new SimpleResponseHandler());
httpClient.close();
返回响应bean;
}

您是服务的所有者是对的吗

如果是这样,我会检查为什么在应答时服务在数据包之间暂停超过6秒:根据异常判断,连接成功


可能的原因:连接周期性地慢,或者服务端的GC很长。甚至是一个长时间的周期性预热阶段(我不知道服务实施的细节,但对于某些特定的请求,服务可能需要花费6秒钟以上的时间来准备响应)-换句话说,任何阻止您的服务在6秒钟内应答的事情。

是的,我拥有服务和客户端。从日志中,我可以看到服务在300毫秒内响应,但连接到服务本身需要时间,在收到响应时,它已经超过了6秒的阈值,并出现了读取超时异常。一般来说,6秒的读取超时太短。