删除临时文件onexit java vm

时间:2014-12-16 17:22:20

标签: java tomcat java-io fileutils

Web应用程序在tomcat服务器上运行,创建临时文件并在其使用结束后将其删除,但某些错误方案临时文件不会被删除。这些是堆积的,永远不会删除。使用deleteOnExit()似乎不起作用,在tomcat服务器关闭后,这些临时文件仍然存在于系统中。

未删除的文件的错误看起来像某个进程仍然保持锁定,所以计划编写一个线程/调度程序类,它将所有这些错误临时文件排队并重新尝试,直到从系统中删除这些文件。< / p>

ShutdownHook与我的想法类似,但我看到的唯一缺点是它只能在关机时运行,是他们可以解决此问题的最佳做法。有什么建议。

2 个答案:

答案 0 :(得分:1)

您不想使用File.deleteOnExit():您的Web应用程序应运行数月而不退出JVM,对吧?相反,你需要自己正确地清理。

使用File.delete()并检查返回状态(它返回boolean:检查它)。如果返回false,请弄清楚为什么会发生这种情况。例如,如果您使用的是Windows,则会有一些(IMO愚蠢的)限制删除由实时进程打开的文件 - 包括尝试删除它们的进程。因此,如果您有另一个线程,其中包含您要删除的文件的文件句柄,则无法删除该文件。

那么,什么是持有 - 打开文件锁?找到并修复它。具体来说,确保你已经正确关闭了所有文件句柄(你是否使用finally块?如果不是,你做错了)并且你没有尝试做一些愚蠢的事情,比如动态生成将文件保存到磁盘,让Tomcat使用DefaultServlet为其提供服务,然后删除该文件。

如果您无法同步进行文件删除工作,则可以尝试异步删除:保留要删除的文件队列(可能在application范围内)并每隔几分钟处理一次。只是尝试删除每个,如果删除成功,将其从队列中删除。如果队列超过某个大小,则自动向管理员发送电子邮件以抱怨队列的大小。

答案 1 :(得分:0)

您是否在同一个网络应用中尝试了以下步骤? - 读取临时文件夹中的现有文件
- 删除之前创建的所有文件(如果有的话) - 现在开始创建新临时文件的东西

相关问题