java - 如果 20 多岁没有 Activity ,tomcat 会超时吗?

标签 java sockets tomcat

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

它是可重现的,从任何 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 在起作用......

最佳答案

唯一影响此“不活动超时”的似乎是

<Connector port="8080" ... connectionTimeout=30000 />设置。

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

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

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

现在这是否“坏”有待解释。在 TCP channel 以某种方式中断(足以停止传输)或客户端在接收字节时“阻塞”,FWIW...

FWIW 连接超时设置影响 many things :

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。

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

关于java - 如果 20 多岁没有 Activity ,tomcat 会超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45361349/

相关文章:

java - org.openqa.selenium.SessionNotCreatedException

java - 整数不像真正的对象?

java - 使用socket读取html并打印

C unix,套接字上的非对称加密

java - 为什么 Java SimpleDateFormat 在某些服务器上工作而在其他服务器上工作?

http - URIEncoding = 'UTF-8' 是如何工作的?

java - 防止用户在 session 关闭后返回

java - 为什么 uDig 的渲染 map 看起来比我的好很多

java - 与浏览器和我的 java 服务器建立客户端/服务器 SSL 连接?

Java "Out of memory error"- 堆/系统 - 去哪里找?