如果我设置tomcat并从中流式传输静态文件,我已经注意到如果客户端"暂停" (停止接收)从该套接字中获取任何内容> 20多岁然后tomcat出现了" sever"任意连接(即使已收到require URI行,连接仍然是#34;已连接" [客户端仍处于活动状态])。什么配置参数控制这个? documentation提到connectionTimeout
但仅与初始标头解析和读取请求正文有关,而不是读取服务器的响应[?]这里是否存在某种不活动超时?< / p>
它是可重现的,从任何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或工人在玩......
答案 0 :(得分:2)
唯一影响这个&#34;不活动超时&#34;
似乎是 <Connector port="8080" ... connectionTimeout=30000 />
设置。
只有当它试图积极地发送数据时才会这样做。在线上(但不能因为客户主动拒绝它或者连接丢失了)。如果servlet正忙于在后台执行cpu,那么写入线路(并且内核接收或缓冲它),没问题,它可能超过connectionTimeout,所以它不是{{ 3}}
我的预感是Tomcat似乎有一个&#34;内置&#34; (未记录?无法单独指定?)写入超时设置,默认为connectionTimeout值,ex(来自tomcat源,随机选择):
java/org/apache/tomcat/util/net/NioEndpoint.java
625: ka.setWriteTimeout(getConnectionTimeout());
现在这是不是&#34;坏&#34;是否需要解释。遇到这种情况&#34;切断&#34;在TCP通道以某种方式被中断(足以停止传输)或客户端是&#34;阻塞&#34;之后发生了tomcat的连接。接收字节时,FWIW ......
FWIW connectionTimeout设置会影响this:
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。
最终结果:我们有一个非常好的网络,所以这些是#34;预期&#34;超时。