如何监视Java EE应用程序中的文件更改



是否有一种可移植的方法来监视来自已部署应用程序的文件更改?

作为一个实际的例子,假设我有一个部署在Glassfish As中的应用程序。然后,当应用程序运行时,我在/META-INF中部署一个配置文件,它将由应用程序中的某个线程读取。

那么,如何实现呢?如何监控文件(或目录)的更改?

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文件,就没有什么可看的。

我认为提供这样的机制是不可能的。您假设"/META-INF"位于文件系统上,但我不认为有任何要求将Java EE应用程序扩展到文件系统。(是的,许多应用服务器出于各种理由这样做,但我很确定这不是一个要求)。

类加载器大量缓存,并且当第一次读取资源时不再从底层文件系统更新资源。

无论如何,您都不允许在纯Java EE中访问和操作文件系统。原因很简单—如果您的线程迁移到另一个节点(对于集群服务器),您的文件将不再可用。容器必须知道这些事情,这样它才能正确地处理它们,而文件系统不是"这些事情"之一。

请查看@jtahlborn的答案。如果您确实可以访问文件系统,那么您有两个选择:

  • 可移植的低效率方法是定期轮询文件系统并检查更改,通过检查修改日期或CRCins文件(较慢)

  • 有效的方法是在文件更改时使用本机操作系统功能来通知。检查libnotify。但是,它需要本地的原生库。

相关内容

最新更新