我有一个基于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意见,那将是非常有帮助的。或者是任何其他你能想到的可能导致这个问题的原因。
8条答案
按热度按时间guz6ccqo1#
服务器正在尝试从请求中读取数据,但是它花费的时间超过了数据从客户端到达的超时值。这里的超时通常是tomcat连接器-〉connectionTimeout属性。
正确。
客户端设置了读取超时,而服务器的响应时间超过该值。
不可以。这会导致客户端 * 超时。*
我经历过的一个线程说,如果启用了keepalive,在高并发性的情况下可能会发生这种情况。
这显然是猜测,而且完全不正确。当且仅当在超时时间内没有数据到达时,才会发生这种情况。期间。加载、保活和并发与此无关。
这只是说明客户端没有发送。你不必担心这个问题。浏览器客户端以各种奇怪的方式来来去去。
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
myss37ts3#
实际上,当你的网络速度很慢的时候,这个错误就会发生,所以试着把超时时间最大化,这样你的代码就一定会像对我一样工作。
ddhy6vgd4#
我在尝试从请求主体读取数据时遇到了同样的问题。在我的例子中,这只会随机发生在基于移动的客户端设备上。因此,我按照link的建议将
connectionUploadTimeout
增加到了1min9ceoxa925#
我也遇到了同样的问题。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示例,它在那里也工作得很好。
花了几天时间试图弄清楚这个问题,但无法解决。
建议非常受欢迎!:)
u59ebvdq6#
这发生在我的应用程序上,实际上我使用的是一个由多个函数调用的对象,这些函数不是线程安全的。
大概是这样的:
由于它们不是线程安全的,我得到了这些错误:
服务器连接异常:java.net.SocketException:套接字已关闭
和
服务器连接异常:java.net.SocketTimeoutException:读取超时
这是我如何修复它:
希望能有所帮助
h43kikqp7#
这意味着服务器响应超时。这是由于服务器配置和互联网响应造成的。
kqqjbcuj8#
我使用的是11.2,但收到超时。
我通过使用下面的 jsoup 版本解决了这个问题。