是否有一種可移植的方式來監視文件中已部署應用程序的更改?如何監視Java EE應用程序中的文件更改?
作爲一個實際的例子,假設我有一個應用程序部署在Glassfish AS中。然後,當應用程序運行時,我在/ META-INF中部署一個配置文件,該文件將由我的應用程序中的某個線程讀取。
那麼,如何實現呢?如何監視一個文件(或一個目錄,就此而言)進行更改?
是否有一種可移植的方式來監視文件中已部署應用程序的更改?如何監視Java EE應用程序中的文件更改?
作爲一個實際的例子,假設我有一個應用程序部署在Glassfish AS中。然後,當應用程序運行時,我在/ META-INF中部署一個配置文件,該文件將由我的應用程序中的某個線程讀取。
那麼,如何實現呢?如何監視一個文件(或一個目錄,就此而言)進行更改?
我認爲提供這樣的機制是不可能的。您假定文件系統上有「/ META-INF」,但我不相信Java EE應用程序需要分解到文件系統。 (是的,很多應用程序服務器都是出於各種各樣的理由,但我確信這不是必需的)。
請檢查@jtahlborn的答案。如果您有訪問文件系統,那麼你有兩種選擇:
便攜式低效的方式是定期輪詢的文件系統,並檢查是否有變化,無論是通過檢查修改日期或CRCins文件(慢)
有效的方法是使用本機操作系統功能在文件更改時得到通知。退房libnotify。但是,它需要本地本地庫。
Java7有一個獨立於平臺的解決方案來監控文件系統中的文件:
http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html
下面是關於如何使用它一個簡短的教程:
http://docs.oracle.com/javase/tutorial/essential/io/notification.html
但正如jtahlborn所說的,如果容器不會爆炸.war文件,就沒有什麼值得注意的。
類加載器在第一次讀取時不會從底層文件系統更新時大量緩存和資源。
無論如何,您都不允許訪問和操作純Java EE中的文件系統。原因很簡單 - 如果你的線程被遷移到另一個節點(對於集羣服務器),你的文件將不再可用。容器必須知道這些事情,以便能夠正確處理它們,而文件系統不是「這些東西」之一。
有沒有一種方法可以在不調用getClass()。getResourceAsStream()的情況下獲取META-INF下的文件? – EdMelo 2011-12-18 21:26:05
不使用J2EE API。 – jtahlborn 2011-12-18 21:29:49
好的,謝謝。 :-) – EdMelo 2011-12-18 21:33:18