我遇到WatchService问题。这里是我的代码片段:WatchService:错过和未处理的事件
public void watch(){
//define a folder root
Path myDir = Paths.get(rootDir+"InputFiles/"+dirName+"/request");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
//stuff
}
}catch(Exception e){}
watckKey.reset();
}
*首先,要知道手表()被调用的无限循环中。
问题是,当一次创建多个文件时,某些事件丢失。例如,如果我将三个文件复制粘贴到“.../request”文件夹中,则只有一个文件被捕获,其他文件保持不变,没有OVERFLOW事件触发。在一些不同的计算机和操作系统中,它最多可以达到两个文件,但如果其中一个尝试3个或更多,其余的仍然未被触及。
虽然我找到了解决办法,但我认为这不是最佳做法。这是流量:
的过程开始,然后停止在
WatchKey watckKey = watcher.take();
如预期,(按照Processing events)。然后,我将3个文件放在“请求”文件夹中,因此,过程恢复在
List<WatchEvent<?>> events = watckKey.pollEvents();
问题在这里。看起来线程在这条线上的速度非常快,以致两个创建的事件保持落后并丢失,只有一个被采用。解决方法是添加一个额外的行权上面这一块,像这样:
Thread.sleep(1000);
List<WatchEvent<?>> events = watckKey.pollEvents();
这似乎是一个解决办法,至少要等三,数人同时文件,但它是不可扩展的。 所以最后,我想知道这个问题是否有更好的解决方案。仅供参考,我正在运行Win 7 64
非常感谢!
在一些点我的编码我做到了这一点,我把腕表服务的创作摆脱了无限循环。我不记得确切的原因,也没有再次尝试这种情况。解决方法仍然存在 – McCoy