Web应用程序在tomcat服务器上运行,创建临时文件并在其使用结束后将其删除,但某些错误方案临时文件不会被删除。这些是堆积的,永远不会删除。使用deleteOnExit()似乎不起作用,在tomcat服务器关闭后,这些临时文件仍然存在于系统中。
未删除的文件的错误看起来像某个进程仍然保持锁定,所以计划编写一个线程/调度程序类,它将所有这些错误临时文件排队并重新尝试,直到从系统中删除这些文件。< / p>
ShutdownHook与我的想法类似,但我看到的唯一缺点是它只能在关机时运行,是他们可以解决此问题的最佳做法。有什么建议。
答案 0 :(得分:1)
您不想使用File.deleteOnExit()
:您的Web应用程序应运行数月而不退出JVM,对吧?相反,你需要自己正确地清理。
使用File.delete()
并检查返回状态(它返回boolean
:检查它)。如果返回false
,请弄清楚为什么会发生这种情况。例如,如果您使用的是Windows,则会有一些(IMO愚蠢的)限制删除由实时进程打开的文件 - 包括尝试删除它们的进程。因此,如果您有另一个线程,其中包含您要删除的文件的文件句柄,则无法删除该文件。
那么,什么是持有 - 打开文件锁?找到并修复它。具体来说,确保你已经正确关闭了所有文件句柄(你是否使用finally
块?如果不是,你做错了)并且你没有尝试做一些愚蠢的事情,比如动态生成将文件保存到磁盘,让Tomcat使用DefaultServlet
为其提供服务,然后删除该文件。
如果您无法同步进行文件删除工作,则可以尝试异步删除:保留要删除的文件队列(可能在application
范围内)并每隔几分钟处理一次。只是尝试删除每个,如果删除成功,将其从队列中删除。如果队列超过某个大小,则自动向管理员发送电子邮件以抱怨队列的大小。
答案 1 :(得分:0)
您是否在同一个网络应用中尝试了以下步骤?
- 读取临时文件夹中的现有文件
- 删除之前创建的所有文件(如果有的话)
- 现在开始创建新临时文件的东西