【问题标题】:Apache JCI FilesystemAlterationMonitor processes changes for existing folder contents on startupApache JCI FilesystemAlterationMonitor 在启动时处理现有文件夹内容的更改
【发布时间】:2011-12-22 20:47:24
【问题描述】:

我在 Java OSGi 服务中使用 Apache JCI 的 FAM (FileAlterationMonitor) 来监视和处理文件系统中的更改。一切似乎都运行良好,除了每当我启动服务(使用下面的代码启动 FAM)时,FAM 都会获取目录中存在的所有更改。

目前我正在看 /tmp /tmp 包含一个子树:/tmp/foo/bar/cat/dog

每次我启动服务并启动 FAM 时,它都会报告 DirectoryCreate 事件:

/tmp/foo
/tmp/foo/bar
/tmp/foo/bar/cat
/tmp/foo/bar/cat/dog

即使没有对该子树的任何部分进行任何更改。

服务激活时运行的代码:

File watchFolder = new File("/tmp"); 
watchFolder.mkdirs();

fam = new FilesystemAlterationMonitor();
fam.setInterval(1000);
fam.addListener(watchFolder, listener);
fam.start();
// I've already tried adding:
listener.waitForFirstCheck();

监听器示例:

private FileChangeListener listener = new FileChangeListener() {
    public void onDirectoryChange(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    public void onDirectoryCreate(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    ...
}

【问题讨论】:

    标签: java filesystemwatcher apache-commons-jci


    【解决方案1】:

    是的,这是 JCI 的一个非常烦人的功能。当监控开始时,它会通过调用onXxxCreate() 通知您它找到的所有文件和目录。我认为您有以下选择

    • 开始监控后,在您的FileChangeListener 回调实现中等待一段时间(几秒钟),然后才能真正处理来自JCI 的事件。这就是我在一个项目中所做的,它工作得很好,尽管您可能会错过在“宽限期”内发生的实际文件创建
    • 获取 JCI 的源并修改它们以使用两个新的事件方法 onDirectoryFound(File)onFileFound(File),只有在启动监控时发现文件和目录时才会触发
    • 看看 Java 7 附带的java.nio.file.WatchService。IMO 是最好的选择,因为它在内部使用本地方法来通知操作系统的更改,而不是启动线程并定期检查。使用 JCI,在将更改传播到回调之前,您可能会遇到几秒钟的延迟

    【讨论】:

    • 不幸的是,我构建的平台不支持 JDK 7,所以就这样了。我最终使用了宽限期策略,效果很好。我正在研究第二种选择,只是为了我自己的启迪。
    【解决方案2】:

    忘记 WatchService。它不直观,并且在尝试查看它是否可以检测到它正在监视的文件夹被删除或更改时存在问题。我会远离它。我曾与 Watcher 合作过,但更喜欢 Apache IO。我相信 Camel 也使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2014-12-25
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多