【发布时间】:2011-12-18 21:11:32
【问题描述】:
是否有一种可移植的方式来监视文件以了解已部署应用程序的更改?
作为一个实际示例,假设我在 Glassfish AS 中部署了一个应用程序。然后,随着应用程序的运行,我在 /META-INF 中部署了一个配置文件,该文件将由我的应用程序中的某个线程读取。
那么,如何实现呢?如何监控文件(或目录)的变化?
【问题讨论】:
标签: java jakarta-ee filesystems monitoring portability
是否有一种可移植的方式来监视文件以了解已部署应用程序的更改?
作为一个实际示例,假设我在 Glassfish AS 中部署了一个应用程序。然后,随着应用程序的运行,我在 /META-INF 中部署了一个配置文件,该文件将由我的应用程序中的某个线程读取。
那么,如何实现呢?如何监控文件(或目录)的变化?
【问题讨论】:
标签: java jakarta-ee filesystems monitoring portability
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 的答案。如果您确实有权访问文件系统,那么您有两种选择:
可移植的低效方法是定期轮询文件系统并检查更改,方法是检查修改日期或 CRC 插入文件(较慢)
有效的方法是使用本机操作系统功能在文件更改时收到通知。查看libnotify。但是,它需要本地本地库。
【讨论】: