我们有两台服务器通过NFS将目录映射到每个服务器。
服务器A(shell脚本)上的进程将文件放入映射驱动器。
服务器B上的Java进程定期轮询映射驱动器并在找到文件后立即对其进行处理。处理完文件后 - 重命名(然后由服务器A上的cron'ed进程删除)
该文件是一个小的.properties文件。一切都适用于几个周期。之后,服务器A和服务器B开始以不同方式查看映射驱动器的内容。我们禁用了NFS缓存和属性查找。问题仍然存在。
如果我去了一个破坏了视图的服务器并执行:
ls
我会看到陷入僵局的文件。但是,如果我再次这样做 - 打印正确的文件列表。
我们对此问题有任何帮助表示感谢。
答案 0 :(得分:1)
我的问题是,当使用计时器循环时,下面的命令会停止seeng实际目录内容。它与NFS服务器不同步。
File[] files = dir.listFiles(new MyFileFilter() );
我得到的解决方案是请求明知不存在的文件。我假设这会使NFS客户端修复或刷新其状态。
// Key point is here: we ask NFS client to obtain unexisting file. Since the client
// cannot find it locally - it will make a call to the NFS server which will
// fix client cache or whatever it uses locally when cache is disabled.
File temp = new File(dir, "unexisting.file");
temp.exists();
如果你知道这种解决方法背后的机制 - 请分享!
答案 1 :(得分:0)
使用哪个NFS服务器?如果该服务器支持文件更改通知,则可以使用该服务器而不是轮询。
答案 2 :(得分:0)
您禁用了哪种缓存? NFS支持目录条目缓存,请参阅nfs Linux man page中的选项acdirmin
和acdirmax
。或者同一手册中的“数据和元数据一致性”一章。