2013-06-13 99 views
29

我有一个基于tomcat的web应用程序。我间歇性地收到以下异常,java.net.SocketTimeoutException:在tomcat下读取超时

Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:150) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) 
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) 
    at org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) 
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:124) 
    at org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:346) 
    at org.apache.coyote.Request.doRead(Request.java:422) 
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) 
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) 
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) 
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200) 
    at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:385) 

不幸的是我没有访问到客户端,所以我只是想在这可能发生各种原因确认,

  1. 服务器尝试从请求中读取数据,但是其花费的时间超过了从客户端到达的数据的超时值。超时在这里通常是tomcat连接器 - > connectionTimeout属性。

  2. 客户端具有读取超时设置,并且服务器花费的时间比响应时间要长。

  3. 我经历的线程之一,说这可能发生在高并发性和Keepalive被启用。

对于#1,我设定的初始值是20秒,我已经将它撞到了60秒,将测试并查看是否有任何变化。

同时,如果你们中的任何一个人都可以就此提供专家意见,那真的很有帮助。或者因为这个原因你可以想到哪些可能会导致这个问题。

在此先感谢。

玉萍

+0

我不相信这是2点;但是,为了确认您还应该设置一个'AccessLogValve'并尝试将此异常与特定请求关联起来。 – fge

+0

嗨Vicky,你能解决这个问题吗?我面临同样的问题。 – Elina

回答

29

服务器尝试从请求读取数据,但其采取比数据从客户端到达超时值。超时在这里通常是tomcat连接器 - > connectionTimeout属性。

正确。

客户端有一个读超时设置,并且服务器正在长于回应。

号,将导致在客户端超时

我经历的线程之一,说这可能发生在高并发性和Keepalive被启用。

这显然是猜测,并且完全不正确。当且仅当没有数据在超时内到达时才会发生。期。负载和保活和并发与它无关。

它只是意味着客户端不发送。你不需要担心它。浏览器客户端以各种奇怪的方式来来去去。

+0

感谢您的输入。 – Vicky

+0

对于#1作为我说,我已经颠簸Tomcat的连接器的连接超时值从20秒到60秒。如果超时减少,我会尝试将其更改为-1(无限)进行测试,并最终设置一个更合适的值。对于#2,如果假设客户端超时应该在服务器上预期什么错误/异常? – Vicky

+0

如果客户端超时读取响应,则服务器根本不会看到任何内容,否则可能会看到“连接重置”。我不会把服务器读取超时时间设得太高:它会连接一个线程。如果一个客户端打开一个到服务器的连接,并且不立即发送任何东西,那么这个操作会非常糟糕。 – EJP

-3

我使用11.2和接收超时。

我用下面jsoup的版本解决。

<dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.7.2</version> 
     <scope>compile</scope> 
    </dependency> 
相关问题