java.net.SocketTimeoutException:读取tomcat下的超时时间

Vic*_*tor 49 java sockets tomcat timeout socket-timeout-exception

我有一个基于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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  3. 我经历过的其中一个线程表示,这可能发生在高并发性和启用了keepalive的情况下.

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

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

提前致谢.

玉萍

use*_*421 38

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

正确.

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

不会.这会导致客户端超时.

我经历过的其中一个线程表示,这可能发生在高并发性和启用了keepalive的情况下.

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

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

  • Vicky,目标不是获得干净的日志文件.目标是为没有行为不端的客户提供服务.读取超时越长,线程等待行为不端客户端的时间越长,因此可用于服务行为客户端的线程越少. (6认同)

Ste*_*ers 7

以下是基本说明:-

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