如果20多年没有活动,tomcat会超时吗?

如果我设置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或工人在玩……

影响这种“不活动超时”的唯一因素似乎是

设置。

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

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

 java/org/apache/tomcat/util/net/NioEndpoint.java 625: ka.setWriteTimeout(getConnectionTimeout()); 

现在这是否“坏”是否需要解释。 在通过某种方式中断TCP通道(足以停止传输)或客户端在接收字节时“阻塞”时,通过tomcat进行连接的“切断”,FWIW ……

FWIW connectionTimeout设置会影响很多事情 :

 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. 

现在显然也是一个writeTimeout。

最终结果:我们有一个flakey网络所以这些是“预期”的超时。