2012-11-19 26 views
0

我有一個Java web應用程序,打包成「戰爭」並部署在Tomcat。該應用程序使用Jersey來實現REST Web服務。如何讓Tomcat等到Web應用程序結束?

此應用程序有時會更新文本(XML)文件。我猜如果Tomcat在應用程序仍在更新此文件時停止,則該文件可能已損壞。爲了防止文件損壞,我希望Tomcat等到文件在退出前關閉。現在我想知道如何實現它。

所以,我的問題是如何使Tomcat等待,直到Web應用程序完成。

回答

2

看看ServletContextListener是特定的上下文銷燬方法。

通知servlet上下文即將關閉。

void contextDestroyed(ServletContextEvent sce) 
+0

謝謝。我想我應該使用一些servlet生命週期方法。但是我不直接使用servles。我使用'Jersey'。 – Michael

+1

就我所知,一個警告是,'HttpServlet'中的'destroy()'方法和類似方法不能保證運行完成。也就是說,Servlet容器(即Tomcat)會給你的servlet提供一個頭,並調用destroy(),但它可能會繼續,直接停止,而不需要等待destroy()完成。 – mmcrae

1

您可以通過修改關機腳本來照顧這。確保文件處於一致狀態,然後調用關機。

您可以檢查文件寫入是否正在處理,然後睡眠腳本5分鐘,然後調用shutdown.sh/shutdown.bat腳本。

除此之外,你也可以在java級別做;但我更願意從外部控制它。這樣,您可以獨立於核心應用程序對其進行修改。

+0

謝謝,但我更喜歡Java的解決方案。 – Michael

2

我會採取不同的方法在你的情況下(這可能不是你的問題的答案,而是你的情況的建議)。

在臨時文件(conf.xml.tmp)中編寫新的xml文件,所以仍然保留原始文件(conf.xml)。

完成生成xml後,只需將原來(conf.xml)中新生成的一個(conf.xml.tmp)移動到頂部即可。

(您也可以複印原件以備用)。

這樣,如果tomcat在處理xml代時停止,您將始終有一個工作的xml。

這裏的關鍵是在同一個磁盤上移動一個文件是某種「原子」操作,它會完成或不完成,但是它不會完成一半。

希望它有幫助