2015-04-22 87 views
5

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

非常感謝!

回答

1

如果手錶被稱爲無限循環中,那麼你創建監視服務無限沒有時間,因此失去了事件的可能性,我會建議做到以下幾點,打電話給你的方法watchservice一次:

public void watchservice() 
{ 
    Thread fileWatcher = new Thread(() -> 
    { 
     Path path = Paths.get(rootDir+"InputFiles/"+dirName+"/request"); 
     Path dataDir = Paths.get(path);  

     try 
     { 
      WatchService watcher = dataDir.getFileSystem().newWatchService(); 
      dataDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); 

      while (true) 
      { 
       WatchKey watckKey; 
       try 
       { 
        watckKey = watcher.take(); 
       } 
       catch (Exception e) 
       { 
        logger.error("watchService interupted:", e); 
        return; 
       } 
       List<WatchEvent<?>> events = watckKey.pollEvents(); 
       for (WatchEvent<?> event : events) 
       { 
        logger.debug("Event Type : "+ event.kind() +" , File name found :" + event.context()); 
        if (event.kind() != StandardWatchEventKinds.OVERFLOW) 
        { 
         // do your stuff 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      logger.error("Error: " , e); 
     } 
    }); 
    fileWatcher.setName("File-Watcher"); 
    fileWatcher.start(); 

    fileWatcher.setUncaughtExceptionHandler((Thread t, Throwable throwable) -> 
    { 
     logger.error("Error ocurred in Thread " + t, throwable); 
    }); 
} 
+0

在一些點我的編碼我做到了這一點,我把腕錶服務的創作擺脫了無限循環。我不記得確切的原因,也沒有再次嘗試這種情況。解決方法仍然存在 – McCoy