首页 > 解决方案 > Java 7 Watch Service 无法正确检测事件

问题描述

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

我在其他地方读到过,WatchService 将无法在远程驱动器上工作,但是当我测试它时它似乎确实可以工作。

我的测试是作为我用来运行 java 服务的用户将新文件复制或“触摸”到监视目录中的混合。

问题:我的 WatchService 在实时部署期间没有检测到这些特定目录中的任何事件。经过进一步检查,这些文件由不同的用户/组拥有,而不是用于执行我的 java 程序的用户/组。

因此,我进行了一项测试,我从一个新组中创建了一个新用户,然后触摸/复制到目录中,它就可以工作了!至少每个人都读取所有文件的权限。(甚至在不为所有人阅读的情况下进行测试,我的程序至少会记录 CREATE_EVENT 无论如何)

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

标签: javawatchservicenio2

解决方案


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

如果监视的文件不在本地存储设备上,则是否可以检测到对文件的更改是特定于实现的。特别是,不需要检测在远程系统上对文件进行的更改。

为什么?因为 Java 用于实现 watch 服务的底层操作系统功能也不能做到这一点1

为什么?因为远程文件系统协议不支持这一点。NFS 肯定不会。SMB也没有。

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

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


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


推荐阅读