【发布时间】:2025-12-29 08:10:12
【问题描述】:
我已经使用 Tomcat 构建了一个流媒体中继服务器。
简单的想法是:一个客户端执行 POST,另一个客户端执行 GET。 servlet 生成一个 Thread 并执行简单的字节混洗,直到 InputSteam(来自 POST)为空。完成后关闭/回答两个请求。一切都很好,而且效果很好,但是:
Tomcat 似乎重用了请求对象甚至 InputStream 对象!每 10 个 POST 左右,InputStream 无法读取,因为已经关闭。仔细查看日志,我意识到之前的请求使用(并因此关闭)完全相同的 InputStream 对象。事实证明,即使是 HttpServletRequest 对象也是完全相同的。
这里发生了什么?为什么 Tomcat 会重用显然没有正确重置的对象?我已经尝试过 7.0.29 和 6.0.16 版本,同样的事情。
【问题讨论】:
-
这种事情通常发生在您在请求完成后保留对资源的引用时。您是否在任何地方存储对请求、响应或流的引用?
-
我没有缓存任何请求或响应对象,但事实证明字节混洗线程释放 InputStream 对象有点太晚了(在请求已经返回之后),所以我认为这是问题。虽然我同意永远不应该缓存这些对象,但 Tomcat 响应如此糟糕的事实令人非常失望!