0

我们在 tomcat 上运行我们的应用程序服务器。

我们有一个生成 PDF 并将其返回给浏览器的 servlet。然后它会删除临时 PDF 文件。

问题是我们在删除时遇到了一些时间问题。我们团队中的某个人决定我们应该在删除文件之前等待 20 秒,所以他们使用了 Thread.sleep(20000)。

有趣的是他们关闭了输出流,等待 20 秒,然后删除文件并退出 doGet()。

我的问题是:由于响应关闭了输出流,它在等待之前立即返回到浏览器,额外的 20 秒等待是否有任何性能问题?例如,它是否占用了网络连接或类似的东西?

4

2 回答 2

0

不,我已经在应用程序中放置了类似的东西并且它运行了很长一段时间,只有输出流被关闭,所以你不能再与用户的当前请求通信,但是由于 doGet 不存在所以 servlet 的在线程超时结束之前,对象不会被销毁。

网络带宽可能不会有问题,因为删除和等待只发生在内存中,就像后台任务一样,唯一影响该网络带宽的是发送响应所花费的时间,因为您响应速度很快,并且然后稍后完成你的工作然后就可以了。

但是,我建议使用 destroy() 方法来删​​除文件。

于 2013-05-15T11:36:23.140 回答
0

我建议使用 File.createTempFile() 创建您的临时文件(除非您已经尝试过并且由于某种原因对您不可行)并让 Java 决定何时删除它。通过在您的 servlet 中使用 Thread.sleep(),您实际上是持有 servlet 实例。ServletContainers 为后续请求创建一个 servlet 池,任何存活 20 秒的 servlet 都会增加您的池大小,并且 Servlet 将无法用于下一个请求,因此容器除了为后续请求创建一个新实例之外别无选择.

可能没有任何网络或带宽相关的问题。但是,以您所描述的方式坚持使用 Servlet 是灾难的根源。

于 2013-05-15T11:43:38.297 回答