有没有办法使用WatchService进行强制轮询?

rjc*_*arr 15 java nio polling

我有使用WatchService监听目录的工作代码,并响应我指定的事件.这很好,并且已经在linux和mac上进行了测试(尽管在后者上很明显使用了轮询).

但是,当我在生产中部署它时,结果是被监视的目录是NFS安装.由于WatchService在linux上运行时使用了inotify,因此从未触发任何事件,因为NFS挂载不会触发inotify事件(或类似的东西,这里有更多信息,这解释了我的问题:Java WatchService在观看映射驱动器时不生成事件) .

由于我的代码已经编写,我宁愿强制WatchService使用轮询实现而不是inotify实现.有没有办法做到这一点?

我通过查找sun.nio.fs.PollingWatchService源代码并直接创建对象(而不是使用FileSystems.getDefault(..newWatchService())来尝试此操作,但是当使用Path注册服务时,我得到了以下异常:java.nio .file.ProviderMismatchException.

那么,有什么想法吗?由于我已经使用WatchService和WatchKey API实现了代码,因此强制轮询比使用自定义或第三方轮询器重写所有内容要容易得多.谢谢!

ame*_*kki 2

您可以尝试开源项目jpoller。它实现了一个名为 DirectoryPoller 的类,该类定期轮询一个或多个目录的内容。它是一个周期性线程,使用文件上次修改时间查找新文件。要下载源代码,您可以访问http://jpoller.sourceforge.net/ 老实说,我没有使用jpoller。我使用了 JDK 7 WatcherService 事件。