我有使用WatchService监听目录的工作代码,并响应我指定的事件。这很好用,并且已经在linux和mac上进行了测试(虽然后者显然使用了轮询)。
但是,当我在生产中部署它时,事实证明被监视的目录是NFS挂载。由于WatchService在linux上运行时使用了inotify,因此从未触发任何事件,因为NFS挂载不会触发inotify事件(或类似的东西,这里有更多信息,这解释了我的问题:Java WatchService not generating events while watching mapped drives)。
由于我的代码已经编写,我宁愿强制WatchService使用轮询实现而不是inotify实现。有没有办法做到这一点?
我通过查找sun.nio.fs.PollingWatchService源代码并直接创建对象(而不是使用FileSystems.getDefault(。。newWatchService())来尝试此操作,但是当使用Path注册服务时,我得到了以下异常: java.nio.file.ProviderMismatchException。
那么,有什么想法吗?由于我已经使用WatchService和WatchKey API实现了代码,因此强制轮询比使用自定义或第三方轮询器重写所有内容要容易得多。谢谢!
答案 0 :(得分:2)
您可以尝试使用开源项目jpoller。它实现了一个名为DirectoryPoller的类,它定期轮询一个或多个目录的内容。 它是一个定期线程,使用文件上次修改时间查找新文件。 要下载源代码,您可以访问http://jpoller.sourceforge.net/ 老实说,我没有使用过jpoller。我使用了JDK 7 WatcherService事件。
答案 1 :(得分:0)
我们遇到了类似的问题,并决定放弃使用WatchService。有几个库实现了池化。我推荐Apache Commons IO Monitor: