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

Java 关闭输出流后,servlet请求会发生什么变化?,java,jakarta-ee,servlets,Java,Jakarta Ee,Servlets,我们正在为应用服务器运行tomcat 我们有一个servlet,它生成PDF并将其返回到浏览器。然后删除临时PDF文件 问题是我们在删除时遇到了一些时间问题。我们团队中有人决定我们应该等20秒再删除该文件,所以他们使用了Thread.sleep(20000) 有趣的是,它们关闭输出流,等待20秒,然后删除文件并退出doGet() 我的问题是:由于输出流在响应时关闭,因此它会在等待之前立即返回到浏览器,对于额外的20秒等待,是否存在任何性能问题?例如,它是否会占用网络连接或类似的连接?不,我已经在

我们正在为应用服务器运行tomcat

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

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

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


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

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

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


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

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


可能不存在任何与网络或带宽相关的问题。然而,以您描述的方式保留Servlet会导致灾难

服务器上的一个工作线程占用了20秒。您可以使用firebug查找绑定的网络连接tomcat不会自动删除临时文件吗?你在时间上有什么困难?一旦servlet写入pdf并关闭流,文件就可以立即删除。为什么首先需要将pdf存储在磁盘文件系统中?为什么不直接将其写入
response.getOutputStream()
而不是写入
新文件outputStream()
?请注意,如果文件保持打开状态,则无法删除该文件。在将PDF写入磁盘后,您可能忘记了
文件输出流#close()
。我们使用crystal reports,这有点愚蠢。我们唯一能弄清楚如何把PDF文件写出来的方法就是将它们写入一个文件并返回文件名。为什么人们一直在投票这个问题?