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

时间:2011-12-18 21:11:32

标签: java java-ee filesystems monitoring portability

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

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

那么,如何实现呢?如何监视文件(或目录)的变化?

4 个答案:

答案 0 :(得分:3)

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文件,那么没有什么值得关注的。

答案 1 :(得分:1)

我认为提供这样的机制是不可能的。您假设“/ META-INF”在文件系统上,但我不认为有任何要求将Java EE应用程序分解到文件系统。 (是的,许多应用程序服务器出于各种原因这样做,但我很确定这不是必需的。)

答案 2 :(得分:1)

类加载器大量缓存,第一次读取时的资源不再从基础文件系统更新。

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

答案 3 :(得分:0)

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

  • 便携式低效方式是定期轮询文件系统并检查更改,方法是检查修改日期或CRC文件(较慢)

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