java.net.SocketTimeoutException:在Tomcat下读取超时

ugmeyewa  于 2022-11-13  发布在  Java
关注(0)|答案(8)|浏览(266)

我有一个基于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属性。
1.客户端设置了读取超时,而服务器的响应时间超过该值。
1.我经历的一个线程说,如果启用了keepalive,在高并发性的情况下可能会发生这种情况。
对于#1,我设置的初始值是20秒,我已经将其提升到60秒,将进行测试,看看是否有任何变化。
同时,如果你们中的任何一个人能提供Maven意见,那将是非常有帮助的。或者是任何其他你能想到的可能导致这个问题的原因。

guz6ccqo

guz6ccqo1#

服务器正在尝试从请求中读取数据,但是它花费的时间超过了数据从客户端到达的超时值。这里的超时通常是tomcat连接器-〉connectionTimeout属性。
正确。
客户端设置了读取超时,而服务器的响应时间超过该值。
不可以。这会导致客户端 * 超时。*
我经历过的一个线程说,如果启用了keepalive,在高并发性的情况下可能会发生这种情况。
这显然是猜测,而且完全不正确。当且仅当在超时时间内没有数据到达时,才会发生这种情况。期间。加载、保活和并发与此无关。
这只是说明客户端没有发送。你不必担心这个问题。浏览器客户端以各种奇怪的方式来来去去。

x9ybnkn6

x9ybnkn62#

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

myss37ts

myss37ts3#

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

实际上,当你的网络速度很慢的时候,这个错误就会发生,所以试着把超时时间最大化,这样你的代码就一定会像对我一样工作。

ddhy6vgd

ddhy6vgd4#

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

9ceoxa92

9ceoxa925#

我也遇到了同样的问题。java.net.socketTimeoutException:在Mac 11.1下的Tomcat上会发生读取超时错误,但在Mac 10.13中它可以完美地工作。同样的Tomcat文件夹,同样的WAR文件。我试过将超时值设置得更高,但没有任何效果。如果我在一个常规的Java应用程序中运行同样的SpringBoot代码(在Tomcat 9.0.41之外(也尝试过其他版本)),那么它也可以工作。
Mac 11.1似乎会干扰Tomcat。
作为另一个测试,如果我将WAR文件复制到AWS EC2示例,它在那里也工作得很好。
花了几天时间试图弄清楚这个问题,但无法解决。
建议非常受欢迎!:)

u59ebvdq

u59ebvdq6#

这发生在我的应用程序上,实际上我使用的是一个由多个函数调用的对象,这些函数不是线程安全的。
大概是这样的:

Class A{
    Object B;
    function1(){
        B.doSomething();
    }
    function2(){
        B.doSomething();
    }
}

由于它们不是线程安全的,我得到了这些错误:
服务器连接异常:java.net.SocketException:套接字已关闭

服务器连接异常:java.net.SocketTimeoutException:读取超时
这是我如何修复它:

Class A{
    function1(){
        Object B;
        B.doSomething();
    }
    function2(){    
        Object B;
        B.doSomething();
    }
}

希望能有所帮助

h43kikqp

h43kikqp7#

这意味着服务器响应超时。这是由于服务器配置和互联网响应造成的。

kqqjbcuj

kqqjbcuj8#

我使用的是11.2,但收到超时。
我通过使用下面的 jsoup 版本解决了这个问题。

<dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
        <scope>compile</scope>
    </dependency>

相关问题