73

我有一个基于 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 秒,将测试,看看是否有任何变化。

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

4

7 回答 7

51

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

正确的。

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

不,这会导致客户端超时

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

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

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

于 2013-06-13T05:45:31.443 回答
8

以下是基本说明:-

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

实际上,当您的互联网速度较慢时会发生错误,因此请尝试最大化超时时间,然后您的代码肯定会像我一样工作。

于 2019-03-05T15:09:32.973 回答
0

我在尝试从请求正文中读取数据时遇到了同样的问题。在我的情况下,仅随机发生在基于移动的客户端设备上。所以我已按照此链接connectionUploadTimeout的建议将时间增加到 1 分钟

于 2020-12-04T17:23:14.720 回答
0

我有同样的问题。java.net.SocketTimeoutException: Read timed out 错误发生在 Mac 11.1 下的 Tomcat 上,但它在 Mac 10.13 中完美运行。相同的 Tomcat 文件夹,相同的 WAR 文件。已尝试将超时值设置得更高,但我没有做任何工作。如果我在常规 Java 应用程序中运行相同的 SpringBoot 代码(在 Tomcat 9.0.41 之外(也尝试过其他版本),那么它也可以工作。

Mac 11.1 似乎在干扰 Tomcat。

作为另一个测试,如果我将 WAR 文件复制到 AWS EC2 实例,它也可以正常工作。

花了几天时间试图解决这个问题,但无法解决。

非常欢迎提出建议!:)

于 2021-01-31T13:38:13.640 回答
-4

这意味着您的服务器响应超时。它是由于服务器配置和互联网响应引起的。

于 2021-03-20T15:32:07.190 回答
-11

我正在使用 11.2 并收到超时。

我通过使用下面的jsoup版本解决了。

    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
        <scope>compile</scope>
    </dependency>
于 2018-02-07T14:40:30.157 回答