关闭输出流后,servlet请求会发生什么?

时间:2013-05-15 11:26:48

标签: java java-ee servlets

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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