我应该在哪里开始调查SocketTimeoutException:读取超时

RHT*_*RHT 24 java apache weblogic httpclient java-ee

我不时地在日志中看到以下堆栈跟踪,HttpClient套接字超时试图text/script从另一个服务器访问内容.我的问题是我应该在Linux上检查在Weblogic上运行的J2EE应用程序的配置设置是什么?我特意寻找以下内容.

  • JVM超时参数
  • HttpClient PARAMS
  • Weblogic超时参数或任何其他配置,如线程数等.
  • J2EE应用程序设置,如servlet配置等.
  • 操作系统资源,如线程,文件处理程序和cpu
  • 可能影响套接字连接的任何其他配置设置
  • 线程转储会有帮助吗?

这是我的代码

HTTPResponse httpClientResponse;
//do some stuff
httpClientResponse.getStatusCode(); // this is where it fails
Run Code Online (Sandbox Code Playgroud)

这就是堆栈跟踪

java.net.SocketTimeoutException: Read timed out
at jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
at jrockit.net.SocketNativeIO.socketRead(SocketNativeIO.java:32)
at java.net.SocketInputStream.socketRead0(SocketInputStream.java)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at HTTPClient.BufferedInputStream.fillBuff(BufferedInputStream.java:206)
at HTTPClient.BufferedInputStream.read(BufferedInputStream.java:126)
at HTTPClient.StreamDemultiplexor.read(StreamDemultiplexor.java:356)
at HTTPClient.RespInputStream.read(RespInputStream.java:147)
at HTTPClient.RespInputStream.read(RespInputStream.java:108)
at HTTPClient.Response.readResponseHeaders(Response.java:1123)
at HTTPClient.Response.getHeaders(Response.java:846)
at HTTPClient.Response.getStatusCode(Response.java:331)
at HTTPClient.RetryModule.responsePhase1Handler(RetryModule.java:92)
at HTTPClient.HTTPResponse.handleResponseImpl(HTTPResponse.java:872)
at HTTPClient.HTTPResponse.access$000(HTTPResponse.java:62)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.java:839)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.java:837)
at
HTTPClient.HttpClientConfiguration.doAction(HttpClientConfiguration.java:666)
at HTTPClient.HTTPResponse.handleResponse(HTTPResponse.java:837)
at HTTPClient.HTTPResponse.getStatusCode(HTTPResponse.java:242) 
Run Code Online (Sandbox Code Playgroud)

谢谢

我将使用下面的调查结果更新我的问题.

  1. 没有明确的超时设置,HttpClient这意味着服务器的http会话超时可能正在生效.
  2. SO_TIMEOUTfor HttpClient为0表示它应该无限期地等待.

Jos*_*seK 15

轨道1

根据javadocs,Httpclient似乎没有Socket超时的默认值.要在更新中回答问题 - 会话超时在此处不起作用.对于会话超时,Weblogic的默认值为30分钟.

服务器session timeout表示HttpSession如果用户未访问服务器,将在内存中保留的时间量.

套接字超时是时间的量,以保持服务器套接字打开,而数据被传输给调用者.这甚至可能是服务器仍在处理和写回数据,但它花了相当长的时间,客户端刚刚等待它.

一些链接表明这个默认值是60秒,但是javadocs没有说什么,无论如何你可以将这个值设置为120秒,看它是否有帮助

http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/params/HttpConnectionParams.html#setSoTimeout(int)

你需要的是计算超时 - 如果这很清楚的话.含义 - 在传出请求的30秒,60秒或5分钟后是否出现这些错误?

我会更改SO_Timeout并再试一次

Track 2 - OS参数

对于NDD值,建议使用BEA参数来控制传入连接保持打开的时间长度以及排队的连接数等等.在Solaris上,这些是通过运行得到的

/usr/sbin/ndd -get /dev/tcp tcp_time_wait_interval 
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q 
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q0 
/usr/sbin/ndd -get /dev/tcp tcp_ip_abort_interval 
/usr/sbin/ndd -get /dev/tcp tcp_keepalive_interval 
Run Code Online (Sandbox Code Playgroud)

您是否可以在Oracle文档中查看Linux上的等效命令,以及它们应设置的值.在Solaris上我的经验是缺省是不够的,他们需要提升到BEA(Oracle)的建议

第3轨:Weblogic /外部访问日志

您是否在服务器上启用了HTTP访问日志?这些失败的请求是否显示任何响应字节大小,或者它们是否显示0响应大小?返回了什么错误代码或HTTP状态代码?

或者这些超时的可能根本没有记录在访问日志中?

在这里,我假设发生超时的外部服务器也是Weblogic,如果没有 - 这个问题是针对他们的等效平台的外部服务器团队.

**其他**

通常线程转储有帮助,但是应该在具有超时问题的服务器上进行线程转储.您是客户端,并且您已成功获得连接,之后在读取响应时超时.那么外部服务器是否过载?缺乏线程?CPU高?并发请求太多了?