2013-05-15 50 views
0

我们在我们的应用服务器的tomcat上运行。关闭输出流后,servlet请求会发生什么?

我们有一个生成PDF文件,并返回到浏览器的servlet。然后删除临时PDF文件。

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

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

我的问题是:由于输出流的响应关闭时,它,是否有任何性能问题在20秒钟等待立即返回给浏览器的等待过吗?例如,它是否捆绑了一个网络连接或一些这样的?

+0

不是tomcat自动删除临时文件吗?你有什么时间困难?一旦pdf由servlet写入并且流关闭,文件可以立即被删除。 – Thihara

+5

为什么您需要首先将PDF存储在磁盘文件系统中?为什么不直接写入'response.getOutputStream()'而不是'FileOutputStream()'?请注意,如果文件保持打开状态,则无法删除该文件。在将PDF写入磁盘之后,您可能忘记了'FileOutputStream#close()'。 – BalusC

+0

那么,服务器上的一个工作线程就被占用了20秒。 你可以使用萤火虫寻找一个连接的网络连接 – Ben

回答

0

哦,不,我已经把类似的东西在一个应用程序,它现在运行了相当一段时间,只输出流是封闭的,所以你不能与用户的当前请求了沟通,但由于使用doGet没存在,所以servlet的对象不会被销毁 ,直到线程超时结束。

可能没有关于网络带宽的问题,因为删除和等待只发生在内存中,就像后台任务一样,影响网络带宽的唯一因素是发送响应所需的时间,因为您快速反应,然后再完成你的工作,然后确定。

我会建议但使用destroy()方法,而不是删除该文件。

0

我会建议使用File.createTempFile()来创建临时文件(除非你已经尝试这样做是不可行的,你无论出于何种原因),并让Java的决定时将其删除。通过在你的servlet中使用Thread.sleep(),你实质上就是持有servlet实例。 ServletContainers为随后的请求创建一个servlet池,任何生活了20秒的servlet都会增加池大小,并且Servlet将不能用于下一个请求,因此容器除了为后续请求创建新实例外没有别的选择。

可能没有任何网络或带宽相关的问题。但是,按照您所描述的方式坚持一个Servlet是一种灾难。