我有一个基于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)
不幸的是我无法访问客户端,因此我只想确认可能发生的各种原因,
服务器正在尝试从请求中读取数据,但其占用的时间超过了从客户端到达数据的超时值。这里的超时通常是tomcat连接器 - > connectionTimeout属性。
客户端设置了读取超时,服务器的响应时间比响应时间长。
我经历过的其中一个主题是,如果启用了keepalive,就会发生这种情况。
对于#1,我设定的初始值是20秒,我已将其提高到60秒,将测试并查看是否有任何更改。
与此同时,如果你们中的任何人能就此提供专家意见,那将非常有帮助。或者就此而言,您可以考虑哪个原因可能导致此问题。
提前致谢。
维基
答案 0 :(得分:33)
服务器正在尝试从请求中读取数据,但是它花费的时间超过了从客户端到达数据的超时值。这里的超时通常是tomcat连接器 - > connectionTimeout属性。
正确。
客户端设置了读取超时,服务器的响应时间比响应时间长。
没有。这会导致客户端超时。
我遇到的其中一个主题是,如果启用了keepalive,这可能会发生高并发性。
这显然是猜测,完全不正确。当且仅当超时内没有数据到达时才会发生这种情况。期。加载和保持活动以及并发与它无关。
这只是意味着客户端没有发送。你不必担心它。浏览器客户端以各种奇怪的方式来来去去。
答案 1 :(得分:4)
以下是基本说明:-
%CATALINA_HOME%/conf/server.xml
)下的“ conf”文件夹中找到“ server.xml”文件。<Connector
。protocol="HTTP/1.1"
的连接器。connectionTimeout
值,则可能需要增加该值-例如从20000毫秒(= 20秒)到120000毫秒(= 2分钟)。如果未在连接器上设置connectionTimeout
属性值,则默认值为60秒-如果该值不足,则可能需要添加该属性。答案 2 :(得分:1)
Connection.Response resp = Jsoup.connect(url) //
.timeout(20000) //
.method(Connection.Method.GET) //
.execute();
实际上,当您的网络速度较慢时会发生此错误,因此请尝试使超时时间最大化,然后您的代码一定会对我有用。
答案 3 :(得分:0)
在尝试从请求正文读取数据时,我遇到了同样的问题。就我而言,这仅随机发生在基于移动的客户端设备上。因此,我根据此link
的建议将connectionUploadTimeout
增加到了1分钟
答案 4 :(得分: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 实例,它在那里也能正常工作。
花了几天时间试图解决这个问题,但无法解决。
非常欢迎提出建议! :)
答案 5 :(得分:-1)
这意味着您的服务器响应超时。这是由于服务器配置和互联网响应造成的。
答案 6 :(得分:-7)
我正在使用11.2并收到超时。
我通过使用下面的 jsoup 版本解决了这个问题。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
<scope>compile</scope>
</dependency>