java – 如果没有20s的活动,tomcat超时?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如果没有20s的活动,tomcat超时?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2074字,纯文字阅读大概需要3分钟。
内容图文
如果我设置tomcat并从中流式传输静态文件,我注意到如果客户端从该套接字“暂停”(停止接收)以获取任何内容> 20s然后tomcat似乎任意“切断”连接(即使已收到require URI行并且连接仍然“连接”[客户端仍然活着]).什么配置参数控制这个? documentation提到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或工人在玩……
解决方法:
影响这种“不活动超时”的唯一因素似乎是
< 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通道(足以停止传输)或客户端在接收字节时“阻塞”时,通过tomcat进入连接的“切断”,FWIW ……
FWIW connectionTimeout设置影响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.
最终结果:我们有一个flakey网络所以这些是“预期”的超时.
内容总结
以上是互联网集市为您收集整理的java – 如果没有20s的活动,tomcat超时?全部内容,希望文章能够帮你解决java – 如果没有20s的活动,tomcat超时?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。