0

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

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

ShutdownHook与我的想法相似,但我看到的唯一缺点是它仅在关机时运行,这是他们解决此问题的任何最佳实践。有什么建议么。

4

2 回答 2

1

您不想使用File.deleteOnExit():您的 Web 应用程序应该在不退出 JVM 的情况下运行数月,对吧?相反,您需要适当地清理自己。

使用File.delete()并检查返回状态(它返回一个boolean:检查它)。如果返回false,找出发生这种情况的原因。例如,如果您在 Windows 上,则对删除由实时进程打开的文件有一些(IMO 愚蠢的)限制 - 包括试图删除它们的进程。因此,如果您有另一个线程具有您要删除的文件的文件句柄,您将无法删除该文件。

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

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

于 2014-12-16T21:32:16.503 回答
0

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

于 2014-12-16T18:16:06.297 回答