【问题标题】:How to monitor file changes within a Java EE application?如何监视 Java EE 应用程序中的文件更改?
【发布时间】:2011-12-18 21:11:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jakarta-ee filesystems monitoring portability


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 有没有办法在不调用 getClass().getResourceAsStream() 的情况下获取 META-INF 下的文件?
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多