我们使用Apache Sever作为前端服务器和后端的Tomcat服务器。前端客户端是一个java swing应用程序。该协议是粗麻布的。
有时我们会收到很多小请求。在执行“nestat -a”时,会有很多TIME_WAIT连接,这些连接会阻止服务器打开新连接。只有与tomcat的连接似乎仍然存在。与apache的连接似乎已关闭。
我们正在使用重写规则将请求转发给tomcat
RewriteEngine On
RewriteCond %{REQUEST_URI} .*\.servlet.*$
RewriteRule ^/(.*)$ http://localhost:8080/$1 [P]
有什么想法吗?
更新:
但它仍然无效。每个流都关闭,仍然有这些TIME_WAIT:
if (conn != null) {
try {
IOUtils.closeQuietly(conn.getInputStream());
} catch (IOException e) {
// do nothing
}
try {
IOUtils.closeQuietly(conn.getOutputStream());
} catch (Exception ex) {
// do nothing
}
try {
IOUtils.closeQuietly(((HttpURLConnection) conn).getErrorStream());
} catch (Exception ex) {
// do nothing
}
}
if (conn instanceof HttpURLConnection) {
((HttpURLConnection) conn).disconnect();
}
答案 0 :(得分:0)
在发出请求时,很可能不会关闭Swing应用程序中的输入/输出流。 来自here:
如果结果是一个InputStream,那么非常重要 InputStream.close()放在finally块中,因为Hessian会 在读取所有数据之前,不要关闭底层HTTP流 输入流已关闭。
答案 1 :(得分:0)
TIME_WAIT
是最近关闭的连接的正常状态,它将保留在内核中,以便进行内核定义的超时。你从应用程序那里做了一切。
如果您的连接闪烁太快并且可用端口短缺,您可以调整系统的回收。 Huge amount of TIME_WAIT connections概述了Linux以及基本理论,Tuning Windows for TCP/IP performance列出了相应的Windows参数,并提供了很多简短的解释。
答案 2 :(得分:0)
它不是Tomcat,它是您的操作系统。
操作系统在TIME_WAIT中保持连接,以避免因过快的端口重用而导致的干扰。想象一下,当新连接在同一个端口打开时,来自旧连接的数据包迟到。