Java 7 Watch Service无法正确检测事件



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

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

我的测试是作为运行java服务的用户,将新文件复制或"触摸"到被监视的目录中。

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

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

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

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

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

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

为什么?因为远程文件系统协议不支持此功能。NFS当然没有。SMB也是如此。

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

如果您真的需要为远程文件系统实现文件监视,则需要在文件实际所在的系统上执行。


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

相关内容

  • 没有找到相关文章

最新更新