0

我已经使用 Tomcat 构建了一个流媒体中继服务器。

简单的想法是:一个客户端执行 POST,另一个客户端执行 GET。servlet 生成一个 Thread 并执行简单的字节混洗,直到 InputSteam(来自 POST)为空。完成后关闭/回答两个请求。一切都很好,而且效果很好,但是:

Tomcat 似乎重用了请求对象甚至 InputStream 对象!每 10 个 POST 左右,InputStream 无法读取,因为已经关闭。仔细查看日志,我意识到之前的请求使用(并因此关闭)完全相同的 InputStream 对象。事实证明,即使是 HttpServletRequest 对象也是完全相同的。

这里发生了什么?为什么 Tomcat 会重用显然没有正确重置的对象?我已经尝试过 7.0.29 和 6.0.16 版本,同样的事情。

4

2 回答 2

1

由于这是一个资源管理问题(您的线程持有InputStream时间过长),您应该能够解决这个问题:让启动线程的 servlet(或将任务提交给Executor...您正在Executor为此使用任何,对吗?)等待线程完成(或Future完成)并释放其资源。如果您将代码发布到字节泵线程(以及 servlet 的相关部分),我可以向您展示如何改进它们。

于 2012-08-10T14:02:31.800 回答
0

更新:

原来,我产生的线程(显然有对输入和输出流的引用)并没有总是及时释放这些引用。谢谢克里斯托弗的指点!

虽然我同意缓存这些对象是一种非常糟糕的做法,而且永远不应该这样做,但令人失望的是 Tomcat 对它的反应如此糟糕。我希望有更好的那种成熟的应用服务器......

于 2012-08-08T22:55:13.290 回答