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 连接器→连接超时属性。

  2. 客户端具有读取超时集,并且服务器需要更长的时间来响应。

  3. 我经历的一个线程说,如果启用了 keepalive,则可以在高并发的情况下发生这种情况。

对于#1,我设置的初始值为20秒,我已将其提高到60秒,将进行测试,并查看是否有任何更改。

同时,如果你们中的任何一个人可以在这方面提供专家意见,那将是非常有帮助的。或者,对于这个问题,您可以想到的任何其他原因都可能导致此问题。


答案 1

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

正确。

客户端具有读取超时集,并且服务器需要更长的时间来响应。

不。这将导致客户端超时

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

这显然是猜测,完全不正确。当且仅当没有数据在超时内到达时,才会发生这种情况。时期。负载、保持活动以及并发性与它没有任何关系。

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


答案 2

以下是基本说明:-

  1. 在Tomcat基目录下的“conf”文件夹中找到“服务器.xml”文件(即)。%CATALINA_HOME%/conf/server.xml
  2. 在编辑器中打开该文件并搜索 。<Connector
  3. 找到超时的相关连接器 - 这通常是 HTTP 连接器,即带有 .protocol="HTTP/1.1"
  4. 如果在连接器上设置了连接超时值,则可能需要将其增加 - 例如,从 20000 毫秒(= 20 秒)增加到 120000 毫秒(= 2 分钟)。如果未在连接器上设置任何属性值,则默认值为 60 秒 - 如果这还不够,则可能需要添加该属性。connectionTimeout
  5. 重新启动雄猫

推荐