java.net.SocketTimeoutException: Tomcat下读取超时

新手上路,请多包涵

我有一个基于 Tomcat 的 Web 应用程序。我间歇性地收到以下异常,

 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. 我经历过的一个线程说,如果启用了保活,这可能会在高并发的情况下发生。

对于#1,我设置的初始值是 20 秒,我将其提高到 60 秒,将测试,看看是否有任何变化。

同时,如果你们中的任何人可以就此提供专家意见,那将非常有帮助。或者就此而言,您可以想到可能导致此问题的任何其他原因。

原文由 Victor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 776
1 个回答

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

正确的。

客户端设置了读取超时,而服务器响应的时间比该时间长。

不,那会导致 客户端超时。

我经历过的其中一个线程说,如果启用了 keepalive,这可能会在高并发情况下发生。

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

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

原文由 user207421 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题