Java7 Watch Service 无法正确检测事件

Java 7 Watch Service cannot detect events properly

我使用 nio2 的 WatchService 为 Linux 服务器创建了一个监视服务 java 应用程序,借此我可以监视已安装的 NAS 驱动器中的一些目录。文件将通过 NFS、MQ 或 SFTP 到达。

我在其他地方读到说 WatchService 不能在远程驱动器上工作,但是当我测试它时它似乎可以工作。

我的测试是将 'touching' 新文件作为我曾经使用 运行 java 服务的用户复制或 'touching' 新文件到监视目录的组合。

问题: 在实时部署期间,我的 WatchService 未检测到这些特定目录中的任何事件。经过进一步检查,这些文件的所有者 user/group 不同于用于执行我的 java 程序的文件。

因此,我进行了一项测试,据此我从一个新组中创建了一个新用户,然后 touched/copied 进入目录并且它有效!至少为每个人读取所有文件的权限。 (甚至在没有为所有人阅读的情况下进行测试,我的程序至少会记录 CREATE_EVENT 无论如何)

我无法为用于 NFS/MQ/SFTP 的用户获取访问权限来测试此问题。因此,我正在寻求一些帮助或至少澄清我在这里面临的问题。

Java 监视服务通常无法检测到远程安装的文件系统上的事件。 javadoc 是这么说的:

If a watched file is not located on a local storage device then it is implementation specific if changes to the file can be detected. In particular, it is not required that changes to files carried out on remote systems be detected.

为什么?因为 Java 用于实现监视服务的底层 OS 功能也无法执行此操作1.

为什么?因为远程文件系统协议不支持这个。 NFS 当然不会。 SMB 也没有。

为什么?因为它不可靠,效率不高,而且无法扩展!

如果您确实需要为远程文件系统实施文件监视,则需要在文件实际驻留的系统上进行。


1 - 指定无法实现的行为是个坏主意!