我遇到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