有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

对于#1,我设置的初始值是20秒,我将其增加到60秒,将进行测试,看看是否有任何更改

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


共 (6) 个答案

  1. # 1 楼答案

    我在尝试从请求主体读取数据时遇到了同样的问题。在我的例子中,这只会随机发生在基于移动的客户端设备上。因此,我将connectionUploadTimeout增加到1min,正如这个link所建议的那样

  2. # 2 楼答案

    我也有同样的问题。爪哇。网SocketTimeoutException:在Mac 11.1下,Tomcat会发生读取超时错误,但在Mac 10.13下,它可以完美地工作。相同的Tomcat文件夹,相同的WAR文件。我尝试过将超时值设置得更高,但我所做的一切都不起作用。 如果我在常规Java应用程序中运行相同的SpringBoot代码(在Tomcat 9.0.41之外(也尝试了其他版本),那么它也可以工作

    Mac 11.1似乎在干扰Tomcat

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

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

    建议(非常欢迎!)

  3. # 3 楼答案

    Server is trying to read data from the request, but its taking longer than the timeout value for the data to arrive from the client. Timeout here would typically be tomcat connector -> connectionTimeout attribute.

    Client has a read timeout set, and server is taking longer than that to respond.

    否。这将导致客户端超时

    One of the threads i went through, said this can happen with high concurrency and if the keepalive is enabled.

    这显然是猜测,完全不正确。只有在超时时间内没有数据到达时才会发生。时期Load、keepalive和并发与此无关

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

  4. # 4 楼答案

    这意味着服务器响应超时。这是由于服务器配置和internet响应引起的

  5. # 5 楼答案

    以下是基本说明:-

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

    Connection.Response resp = Jsoup.connect(url) //
                    .timeout(20000) //
                    .method(Connection.Method.GET) //
                    .execute();
    

    事实上,当你的网速很慢时就会出现错误,所以尽量延长超时时间,这样你的代码肯定会像我一样工作