我有一个 Java Web 应用程序,打包为“战争”并部署在Tomcat
. 该应用程序用于Jersey
实现 REST Web 服务。
此应用程序有时会更新文本 (XML) 文件。我猜如果Tomcat
在应用程序仍在更新此文件时停止,则该文件可能已损坏。为了防止文件损坏,我想Tomcat
等到文件关闭后再退出。现在我想知道如何实现它。
所以,我的问题是如何Tomcat
等到 Web 应用程序完成。
看看ServletContextListener特别是 context Destroyed 方法。
Servlet 上下文即将关闭的通知。
void contextDestroyed(ServletContextEvent sce)
在您的情况下,我会采取不同的方法(这可能不是您问题的答案,而是您的情况的建议)。
将新的 xml 文件写入临时文件 (conf.xml.tmp),这样您的原始文件 (conf.xml) 仍然保持不变。
完成生成 xml 后,只需将新生成的 (conf.xml.tmp) 移到原始 (conf.xml) 的顶部。
(您也可以复制原件用于备份)。
这样,如果 tomcat 在处理 xml 生成时停止,您将始终拥有一个工作 xml。
这里的关键是在同一个磁盘中移动文件在某种程度上是一种“原子”操作,它会完成或不完成,但不会完成一半。
希望能帮助到你
您可以修改关闭脚本来解决这个问题。确保该文件处于一致状态,然后调用关闭。
您可以检查文件写入是否正在处理中,然后将脚本休眠 5 分钟,然后调用 shutdown.sh/shutdown.bat 脚本。
除此之外,您还可以在 java 级别执行;但我更喜欢从外部控制它。这样您就可以独立于您的核心应用程序对其进行修改。