我使用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-指定无法实现的行为是个坏主意