Java 如果20秒内没有活动,tomcat会超时吗?

Java 如果20秒内没有活动,tomcat会超时吗?,java,sockets,tomcat,Java,Sockets,Tomcat,如果我设置tomcat并从中流式传输一个静态文件,我注意到,如果客户端从该套接字“暂停”(停止接收)超过20秒,则tomcat会出现任意断开连接(即使已接收到请求URI头且连接仍然“连接”[客户端仍处于活动状态])。什么配置参数控制这一点?提到了connectionTimeout,但仅涉及到初始头解析和读取请求正文,而不是读取服务器的响应[?]这里是否存在某种不活动超时 它是可复制的,从任何tomcat应用程序流式传输(大)静态文件,并通过暂停的客户端接收,ex test.rb: require

如果我设置tomcat并从中流式传输一个静态文件,我注意到,如果客户端从该套接字“暂停”(停止接收)超过20秒,则tomcat会出现任意断开连接(即使已接收到请求URI头且连接仍然“连接”[客户端仍处于活动状态])。什么配置参数控制这一点?提到了
connectionTimeout
,但仅涉及到初始头解析和读取请求正文,而不是读取服务器的响应[?]这里是否存在某种不活动超时

它是可复制的,从任何tomcat应用程序流式传输(大)静态文件,并通过暂停的客户端接收,ex test.rb:

require "socket"
host = "localhost"
port = 8080
socket = TCPSocket.new host,port
url = "/your_webapp/large_static_filename.ext"
request = "GET #{url} HTTP/1.0\r\nHost:#{host}\r\n\r\n"
socket.print request
puts "reading"
response = socket.sysread 1_000_000
puts response.length
puts response[0..300]
puts "sleeping 25" # with 10s or several reads separated by 10s, it is OK
sleep 25
response2 = socket.read
# this should equal the total size, but doesn't...
puts "sum=#{response2.length + response.length}"

它可以与其他服务器配合使用,因此可能不会受到操作系统的限制。这只是一个普通的Tomcat,所以没有mod_jk或worker在起作用……

唯一影响这个“不活动超时”的是

设置

并且只有当它试图主动地“发送数据”到线路上时(但不能,因为客户端主动拒绝它,或者如果连接已丢失)。如果servlet只是在后台忙着处理cpu,然后写入连线(内核接收或缓冲),那么没问题,它可以超过connectionTimeout,所以不是

我的直觉是Tomcat似乎有一个“内置”(未记录?无法单独指定?)写入超时设置,默认为connectionTimeout值ex(来自Tomcat源,随机选择):

现在,这是否“坏”有待解释。在TCP通道以某种方式中断(足以停止传输)或客户端在接收字节时“阻塞”之后,tomcat会运行此连接“断开”,FWIW

FWIW连接超时设置影响:

现在显然也是一份书面报告


最终结果:我们有一个脆弱的网络,所以这些都是“预期”超时/断开的连接(通过一个不同名称LOL的配置)。

听起来像我的问题,在我的例子中,这是一个特定于设备的Android问题,但其他一些答案可能是相关的。
java/org/apache/tomcat/util/net/NioEndpoint.java
625:            ka.setWriteTimeout(getConnectionTimeout());
The total amount of time it takes to receive an HTTP GET request.
The total amount of time between receipt of TCP packets on a POST or PUT request.
The total amount of time between ACKs on transmissions of TCP packets in responses.