Apache Commons IO文件监控与JDK WatchService的比较

7
我需要开发一个应用程序,可以在预定义的目录中创建csv文件时立即处理这些文件。预计会有大量的传入文件。
我看到过使用Apache Commons IO文件监控的应用程序在生产中使用。它的效果非常好。我曾经看到它能够在一天内处理多达2100万个文件。看来Apache Commons IO文件监控会轮询目录并进行listFiles以处理文件。
我的问题是:JDK WatchService与Apache Commons IO文件监控相比是否同样优秀?有人知道任何优缺点吗?

Commons IO 是纯 Java 的,据我所知,因此它可能与 WatchService 匹配,但我怀疑它是否能更有效率... - assylias
1个回答

7
自从我问这个问题以来,我对这个问题有了更多的了解。因此,我想为那些可能有类似问题的人回答一下。 Apache commons monitoring 使用可配置的轮询间隔机制。在每次轮询中,它调用 File 类的 listFiles() 方法,并将其与上一次迭代的 listFiles() 输出进行比较,以识别文件创建、修改和删除。该算法足够强大,我从未见过任何漏报。即使处理大量文件,它也表现出色。但是,由于它在每次迭代中轮询并调用 listFiles,如果输入文件流不多,它将消耗不必要的 CPU 周期。它甚至可以在网络驱动器上运行。 JDK WatchService 不需要轮询。它是基于事件的。它仅在发生事件时触发,因此如果输入文件流不是很多,则需要较少的 CPU。如果输入文件流很大,且事件处理机制的处理速度低于事件发生的速度,则可能会发生事件溢出。此外,它无法在网络驱动器上工作。
因此,总之,如果文件流连续而庞大,则最好选择 Apache 文件监视。否则,JDK WatchService 是一个不错的选择。

1
根据https://docs.oracle.com/javase/8/docs/api/java/nio/file/WatchService.html,“观察文件系统事件的实现旨在直接映射到本地文件事件通知设施(如果可用),或者在本地设施不可用时使用原始机制,例如轮询。” - Scott Markwell
@ScottMarkwell:你知道是否有一种方法可以强制使用“原始”轮询而不是依赖于inotify吗?我有一个网络附加磁盘,所以事件不会被触发,但是我仍然想使用监视服务,并且似乎它在必要时可以回退到轮询。那么我们能否强制它这样做呢? - rjcarr
我不知道如何处理这个问题,这取决于您使用的JVM。建议您向该供应商咨询。 - Scott Markwell
2
Apache Commons 监控不仅适用于网络驱动器,还可以从容器化应用程序内部工作(在 Docker 中的应用程序)。 - Tim Perry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接