使用WatchService是否有强制轮询的方法?

16
我有一个可以监听目录并响应指定事件的工作代码。它在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())来尝试实现这一点,但是当将服务注册到路径时,我遇到了这个异常:java.nio.file.ProviderMismatchException。
那么,有什么想法吗?既然我已经使用了WatchService和WatchKey API实现了代码,那么只是强制轮询比使用自定义或第三方轮询器重新编写全部代码要容易得多。谢谢!

这种方法有点慢且效率低下,但是考虑使用 File f = new File(YOUR_DIRECTORY, "_garbage.tmp"); new FileOutputStream(f).close(); f.delete();,并监听文件名为 "_garbage.tmp" 的文件创建事件如何? - k_g
@k_g:感谢您的回复,但我不明白它如何有帮助。您能否详细说明一下? - rjcarr
@k_g:是的,但问题在于WatchService在映射驱动器上不起作用。我只是想问一下是否可以强制它使用轮询实现,而不仅仅是获取平台支持的内容(因为这种实现并不适用于所有文件系统)。 - rjcarr
你成功地扩展了AbstractWatchService并基于PollingWatchService创建了自己的吗? - James
你可以在远程服务器上运行一个小的WatchService应用程序,然后使用RMI将本地客户端注册为观察者。 - Pétur Ingi Egilsson
显示剩余2条评论
2个回答

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

0

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