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

时间:2019-01-28 06:04:26

标签: java watchservice nio2

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

我在其他地方阅读过,指出WatchService将无法在远程驱动器上工作,但是在我测试它时似乎可以正常工作。

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

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

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

我无法为用于NFS / MQ / SFTP的用户获取访问权限以测试此问题。因此,我在这里遇到的问题上寻求帮助或至少是清晰的。

1 个答案:

答案 0 :(得分:0)

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

  

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

为什么?因为Java用于实现监视服务的底层OS功能也无法做到这一点 1

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

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

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


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