我有一个基于 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)
不幸的是,我无法访问客户端,所以我只是想确认可能发生这种情况的各种原因,
服务器正在尝试从请求中读取数据,但它花费的时间超过了数据从客户端到达的超时值。这里的超时通常是 Tomcat 连接器 → connectionTimeout 属性。
客户端设置了读取超时,而服务器响应时间比该时间长。
我经历过的一个线程说,如果启用了保活,这可能会在高并发的情况下发生。
对于#1,我设置的初始值是 20 秒,我将其提高到 60 秒,将测试,看看是否有任何变化。
同时,如果你们中的任何人可以就此提供专家意见,那将非常有帮助。或者就此而言,您可以想到可能导致此问题的任何其他原因。